




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、合用文案近来在做一个数据采集项目,涉及到好多与西门子S7系列PLC的通讯,由于自己的VC水平属于半瓶子晃悠,所以就想利用C#来进行开发(个人比较喜欢C#的代码风格,看着很清爽),诚然C#这种高级语言与基层的设备通讯效率确实不如C+,但幸好数据量不大,实时性要求不算太高,用C#还是可以应付的。在界面开发方面,高级语言确实不如WinCC,Intouch之类的组态软件,但在数据办理上面,却有很大的灵便性。在这里很感谢吴旭日,在中国工控网上面发现了他的文章,由于我是从C#转到工控方向的,以前对PLC一点都不懂,刚接触这一行时,学习起来很费力,看了他的这篇文章,让我对PLC的有了更加深入的认识。我的这个
2、DCProdave.cs就是在他的基础上更正的,加了一些自己的东西。还望各位多多提建议,多多交流!Prodave版本:PRODAVE6.0-W95_S7.DLLPLC模拟环境:PLCSIMV5.4开发环境:VS.NET2005.从w95_s7.dll中导入PLC通讯件数的方法DllImport在使用DllImport以前,必定引入InteropServices,代码以下:usingSystem.Runtime.InteropServices;详细使用方法可以参照我的博客中转载的一篇文章C#(.net)中的DllImport用法转写的很不错,千万要注意C+数据种类到C#的对应关系,采用合适的种类
3、。比方char*可以用string来变换,指针种类可以ref也许数组。二.定义结构体种类2.1PLC连接参数结构体/定义结构体连接PLC所需参数publicstructPLCConnParam标准文档合用文案4publicbyteAddres;/定义CPU的MPI/DP地址5/publicbyteSegmentId;/保留为06publicbyteRack;/定义CPU的机架号7publicbyteSlot;/定义CPU的槽号82.2PLC储藏地域种类编号/定义列举种类PLC的储藏地域编号publicenumPLCBlockTypeI=1,/InputbytesQ=2,/Outputbytes
4、M=3,/FlagbytesT=4,/TimerwordsZ=5,/CounterwordsD=6,/DatafromDB10三.常用函数详细讲解3.1建立PLC连接函数第一从W95_S7.DLL中导入连接函数,接见权限为私有,C#将会对此函数进行封装,供外面调用,稍后讲解./与PLC建立连接,该函数必定在其他全部函数调用以前被调用/标准文档合用文案3/连接数,在DOS,WIN3.1最多可以有4个,在WIN95以上最多可以有16个4/与PLC通讯的设备名称,一般为S7ONLINE/参数列表,4个值分别为MPI/DP地址,保留值=0,槽号,机架号6/0正常返回,非0为错误号7DllImport(
5、w95_s7.dll)8privateexternstaticintload_tool(bytenr,stringdevice,byte,adr_table);说明:在一个MPI/DP网络中若有多个PLC时,可指定多个连接列。最后一列的全部参数须置0,以标志参数列结束。比方一个MPI/DP网中有两个PLC,他们的MPI地址分别为2和3,槽号均为2,机架号均为0,则可按以下方式调用:byte,ba=2,0,2,0,3,0,2,0,0,0,0,0;interr=load_tool(1,s7online,ba);返回值为int型,若是返回0则表示执行成功,非零值,则需要依照错误号查找到错误详细信息,
6、详细参照本文第五部分:错误代码字典自然若是PLC使用的是DP网络时,只需要将SetPG/PCInterface中接口参数分配选为PLCSIM(PROFIBUS)即可,Prodave不需要做任何更正(自然PLC地址必定也是DP口的地址哦),详细以下图:标准文档合用文案个人不太习惯西门子的这种函数命名,干脆就依照C#的常用习惯,进行一下简单的封装,供外面调用.1/建立连接,同一个连接只同意调用一次2/3/连接号connNo为1-44/连接参数,PLCConnParam定义的参数结构体5/返回10进制错误号,0表示没有错误6publicstaticintOpen(byteconnNo,PLCConn
7、ParamconnParam)intPLCCPUCnt=connParam.Length;9if(PLCCPUCnt=0)/传达参数不正确return-1;标准文档合用文案1213byte,btr=newbytePLCCPUCnt+1,4;/多分配1个,用于存放0作为连接结束标志/变换连接表for(inti=0;iconnParam.Length;i+)17btri,0=connParami.Addres;18btri,1=0;19btri,2=connParami.Slot;20btri,3=connParami.Rack;2122btrconnParam.Length,0=0;23btrc
8、onnParam.Length,1=0;24btrconnParam.Length,2=0;25btrconnParam.Length,3=0;/调用初始化函数,打开连接27interrCode=load_tool(connNo,S7ONLINE,btr);28returnerrCode;29建立于PLC的连接,只需在数采程序启动的时候调用即可,并且只能打开一次,否则报错.驱动设备名称S7ONLINE,一般情况下是不会有变化的,所以这里就写死了.特别需要指出的是,这个函数的第一个参数(连接号),是指当前连接有多少个PLC连接(严格意义上来讲,是CPU的个数,由于有可能2个PLC共用1个CPU,
9、之间经过IM467组态),激活连接并交换数据的时候,和这个值有点关系.在建立连接的时候默认激活第1个连接.标准文档合用文案3.2断开与PLC的连接从W95_S7.DLL中导入函数,仍旧是私有,由于我要对全部的导入函数进行封装.1/断开与PLC的连接,必定退出数采软件以前调用,否则PLC的连接素来被占用,影响下次连接2/3/0正常返回,非0为错误号4DllImport(w95_s7.dll)5privateexternstaticintunload_tool();关闭PLC的连接函数进行C#封装,没有改变任何代码,可是换了个函数名.publicstaticintClose()returnunlo
10、ad_tool();3.3激活连接,当前连接列中某个时刻有且只有1个PLC是激活状态.建立连接的时候,默认激活第1个连接.1/激活与MPI网中的哪个CPU通讯,load_tool后默认激活第一个CPU连接2/3/连接号,对应于参数adr_table所传达的连接参数序次4/0正常返回,非0为错误号,若激活的连接在MPI网中没有,则返回错误号5175DllImport(w95_s7.dll)6privateexternstaticintnew_ss(byteno);标准文档合用文案其参数与load_tool中参数adr_table所传达的连接参数序次对应比方byte,btr=2,0,2,0,3,0
11、,2,0,0,0,0,0,new_ss(1)则激活第1个连接即与MPI地址为2的PLC通讯,近似的new_ss(2)则激活与MPI地址为3的PLC通讯,在数采系统中,为了读取全部PLC的数据,采用准时循环激活每个PLC的连接,尔后读取其数据.C#封装以下:1publicstaticintActiveConn(intconnNO)returnnew_ss(byte)connNO);3.4从DB块中读取字节数据(返回BYTE数组)1/从DB中读取BYTE数组(字节数可以是任意长度的)2/3/DB块号4/DBB初步编号,0表示DBB0,1表示DBB1,跨度为BYTE/读取的BYTE长度(任意长度,可
12、以为奇数)/返回值,BYTE型buffer7/0正常返回,非0为错误号8DllImport(w95_s7.dll)9privateexternstaticintd_field_read(intblockno,intno,intamount,bytebuffer);C#封装以下:1/读取DB块的BYTE数据2/标准文档合用文案3/DB块号,如:DB24/DB数据的初步字节,如DBB2则从2开始读5/要读取的字节数,如从DBB2-DBB5,共4个字节6/BYTE型缓存区,储藏读取的数据7/数据缓存区的初步地址8/返回值0:成功非0:错误代码9publicstaticintGetDBByteData
13、(intDBBlockNO,intDBBNO,intDBByteAmount,bytebuffer,intStartIndex)bytebBufTemp=newbyteDBByteAmount;interrCode=d_field_read(DBBlockNO,DBBNO,DBByteAmount,bBufTemp);for(inti=0;iDBByteAmount;i+)bufferi+StartIndex=bBufTempi;returnerrCode;这个函数是用的最多的一个函数,在数采系统中,习惯一次性的将全部需要用到数据,全部读到字节数组中,一致办理,防备不相同时期纷杂读取造成的数据
14、不一致.需要提示的是,必定保证数据办理函数获取的数据,是PLC一次扫描周期内的.3.5从DB中读取整数值(int32型)标准文档合用文案1/从DB中读取INT数据(DBW:INT16也许DBD:INT32),最多4个字节的整数2/3/DB块号4/DBW初步编号,0表示DBW0,1表示DBW2,跨度为WORD5/读取的WORD长度(1个WORD=2个BYTE)2:DBW,4:DBD6/返回值,int型整数(十进制)7/0正常返回,非0为错误号8DllImport(w95_s7.dll)9privateexternstaticintdb_read(intdbno,intdwno,refintanz
15、ahl,refintbuffer);C#封装1/从DB块中读取整型数据2/要读取DB2.DBW6,则DB块号为2,DBB号为6,字节长度为23/要读取DB2.DBD6,则DB块号为2,DBB号为6,字节长度为44/5/DB块号,如:DB26/DBB的初步字节号,如DBW2则从2开始读,由于是WORD(2个BYTE),DBB号必定为偶数/要读取的BYTE数,必定是偶数(这里只能是2和4,在PLC中只有DBW,DBD两种整数)8/INT32型缓存区,储藏读取的十进制数据9/返回值0:成功非0:错误代码10publicstaticintGetDBInt32Data(intDBBlockNO,intD
16、BBNO,intDBByteAmount,refintbuff标准文档合用文案er)1112intDBWNO=DBBNO/2;13intDBWordAmount=DBByteAmount/2;14interrCode=db_read(DBBlockNO,DBWNO,refDBWordAmount,refbuffer);15bytebbuf=newbyte4;16GetByteFromInt32(buffer,bbuf,true);17buffer=bbuf0*0 x1000000+bbuf1*0 x10000+bbuf2*0 x100+bbuf3;returnerrCode;这个函数读取的是一
17、个整数,由于DB中有DBB,DBW,DBD3种数据种类,最大的DBD是4个字节,所以设计了这个函数,读取单个的整型值,不用再进行BYTE到INT的变换了.这里值得一提的是整数高位优先,还是低位优先的问题,字节数组的序次切记要更正,别的buffer=bbuf0*0 x1000000+bbuf1*0 x10000+bbuf2*0 x100+bbuf3;这行代码很有意思,16进制的字节进位是0 x100.3.6M,I,Q3种块的读取函数近似(参数都是相同的),这里放在一起进行说明区读取函数/读取PLC中的M字节数据/3/指定M字节号,比方要读取MB10的值,则指定no等于104/指定读取的字节数,比
18、方需要读取MB10至MB14之间的值,则可指定为5标准文档合用文案5/返回获取的值,这是一个十进制的值,若是需要获取某一个M位的状态,需要把它变换成二进制6/0正常返回,非0为错误号7DllImport(w95_s7.dll)8privateexternstaticintm_field_read(intno,intanzahl,bytebuffer);I区读取函数,素来不理解为什么输入区(单词input)简称为I,而函数名却为A,此后才了解,这个A是德文的表示方法,(Pordave是西门子公司的东东).1/读取Output值2/3/QB号4/读出多少个QB字节5/返回读出的值,十进制6/0正常
19、返回,非0为错误号7DllImport(w95_s7.dll)8privateexternstaticinta_field_read(intno,intanzahl,bytebuffer);Q区读取函数,参数与I相同.1DllImport(w95_s7.dll)2privateexternstaticinte_field_read(intno,intanzahl,bytebuffer);C#封装,M,I,Q3种块的读取函数近似,这里放在一个函数里,利用列举种类PLCBlockType进行区分1/从M,I,Q区中读取字节数组2/3/Block种类,在列举PLCBlockType中定义,如要读取M
20、区的值,则b标准文档合用文案lockType=PLCBlockType.M4/区号,如IB10,MB105/要读取的字节数量,如IB10-IB14共5个字节6/byte种类的buffer7/byte储藏的初步地址8/0正常返回,非0为错误号9publicstaticintGetMIQByteData(PLCBlockTypeblockType,intBlockNO,intByteAmount,bytebbuf,intStartIndex)1011interrCode=0;12bytebBufTemp=newbyteByteAmount;/局部变量,不用担忧内存释放的问题.C+程序员看到new估
21、计很谨慎.13switch(blockType)/依照块种类,调用相应的块读取函数.1415casePLCBlockType.M:errCode=m_field_read(BlockNO,ByteAmount,bBufTemp);break;16casePLCBlockType.I:errCode=e_field_read(BlockNO,ByteAmount,bBufTemp);break;17casePLCBlockType.Q:errCode=a_field_read(BlockNO,ByteAmount,bBufTemp);break;1819for(inti=0;iByteAmoun
22、t;i+)/由于C#中对指针有所限制,从数组指定的初步地址,逐个赋值.bbufi+StartIndex=bBufTempi;标准文档合用文案returnerrCode;,BYTE,INT,BOOL几各种类的数据变换函数4.1从32位整数中提取字节数组(4个byte)1/从INT32型数据中提取byte字节数组2/3/源数据(long型)4/字节数组,存放提取的Byte数据5/初步地址6/提取的字节数7/long型源数据可否高位优先,若是不是,则进行反向提取8publicstaticvoidGetByteFromInt32(intibuf,bytebbuf,boolisBigEndian)9if
23、(isBigEndian)/高位优先,则反向提取.12for(inti=0;i=8;/右移8位16标准文档合用文案else/低位优先,按序次提取.20for(inti=3;i=0;i-)2122bbufi=(byte)(ibuf&0 x000000ff);23ibuf=8;4.2从字节数据中提取bit数组(8个bit),以bool型数据代替位表示.1/从Byte数据中获取全部bit的值(1Byte=8Bit,false:0,true:1)2/3/源数据(Byte型),其中的8个bit位,从右到左0-7编号4/bit数组,存放Byte中的8个bit的值,0:false,1:true5/在bit数
24、组中存放的初步地址6publicstaticvoidGetBitFromByte(bytebyteData,boolbitArray,intstartIndex)78bytebyteArray=newbyte1;9byteArray0=byteData;10BA=newSystem.Collections.BitArray(byteArray);标准文档合用文案11for(inti=0;i=7;i+)/依次取8个位,逐个赋值bitArraystartIndex+i=BA.Get(i);4.3从字节数据中提取某一位的状态,以bool型返回1/从Byte数据中获取某一位bit的值(false:0,
25、true:1)2/3/源数据(Byte型),其中的8个bit位,从右到左0-7编号4/bit位编号,从右到左以0-7编号5/bit值,以bool型返回,false:0,true:16publicstaticvoidGetBitFromByte(bytebyteData,intbitNo,refboolbitData)78if(bitNo=0&bitNo=7)/位号必定在07之间910bytebyteArray=newbyte1;11byteArray0=byteData;BA=newSystem.Collections.BitArray(byteArray);bitData=BA.Get(bitNo);标准文档合用文案五.错误代码字典1/依照错误代码返回错误信息/比方interrCode=ActiveConn(1);sringerrInfo=GetErrInfo(err);/4/错
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗教育革新远程协作工具在医疗培训中的应用
- 医养结合服务模式的理论基础与实际应用
- 专科护士在医疗安全中的教育与培训
- 代工采购合同范例
- 利用商业智能和医疗大数据提升企业员工整体健康的策略与实践
- 小儿上肢肿块的临床护理
- 公司木材采购合同范例
- 以移动支付为驱动的电子商务平台创新研究-基于区块链技术分析
- 专利实施独占合同范例
- 住宅个人贷款合同范例
- 2024年高中生物学业水平合格考及答案
- 《DAO:元宇宙经济组织》记录
- 安徽省合肥市科大附中2025年第二次中考模拟初三数学试题试卷含解析
- 2024年重庆市大渡口区中考第二次适应性考试物理试题(原卷版)
- 2024年7月中央电大本科《法律文书》期末考试试题及答案
- 因式分解(分组分解法)练习100题及答案
- GB/T 15597.2-2024塑料聚甲基丙烯酸甲酯(PMMA)模塑和挤出材料第2部分:试样制备和性能测定
- 信息素养测试一附有答案
- 医学美容技术专业《美容美体技术》课程标准
- JT-T-1180.1-2018交通运输企业安全生产标准化建设基本规范第1部分:总体要求
- 国能辽宁北票200MW 风力发电项目可行性研究
评论
0/150
提交评论