资源描述
实现C#与信捷PLC通讯实现C#与信捷PLC通讯信捷PLC在与PC通讯的时候,作为下位机,则上机必须按照MODBUS RTU的数据格式与其进行数据交换;下面为大家讲解相关使用:1、什么是MODBUS RTU协议?MODBUS RTU的数据格式:请阅读Modbus协议中文版.pdf,通过这个 介绍你会对MODBUS协议有所了解,其中还详细介绍了modbus通讯的另一种 模式一一MODBUS ASCII模式,关于两者之间的区别,在此不再重复阐述,Modbus协议中文版.pdf上都有介绍,使用中请区分RTU和ASCH模式,不能笼统的认为使用的协议是MODBUS协议。2、MODBUS RTU的数据格式:01 06 00 01 00 17 98 04从机地址功能码数据地址数据 CRC校验这一串数据的意思是:把数据0 x0017(十进制23)写入1号从机地址0 x0001数据地址。2.1功能码功能码描述功能码描述0 x01读线圈状态0 x05写单个线圈0 x02读离散输入状态0 x06写单个保持寄存器0 x03读保持寄存器0 x10写多个保持寄存器0 x04读输入寄存器0 x0F写多个线圈2.2读寄存器:(0 x03功能码)读取格式:地址功能码寄存器起始地址寄存器数量CRC16校验Adrr0 x03高8位低8位高8位低8位低8位高8位返回格式:地址功能码字节数寄存器数据CRC16校验Adrr0 x03N高8位|低8位低8位|高8位2.3写寄存器:(0 x10功能码):写入格式:地址功能码寄存器起始地址寄存器数量寄存器数据CRC16校验Adr r0 x10高8位 低8位高8位低8位高8位低8位低8位高8位返回格式:地址功能码寄存器起始地址寄存器数量CRC16校验Adrr0 x10高8位 低8位高8位 低8位低8位 高8位2.4示例发送:01 03 00 01 00 01 D5 CA从机地址功能号数据地址读取数据个数CRC校验 1实现C#与信捷PLC通讯那么PLC接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断 数据无误,则返回信息给主机:返回内容:01。3 02 00 17 F8 4A从机地址功能号数据字节个数数据CRC校验MODBUS主机就完成了 一次对从机PLC数据的读操作,实现了通讯。3、核心代码using System;using System.IO.Ports;using System.Threading;namespace Sylowly.Base(public class PLCHelper(public SerialPort SerPort get;set;public int IntTimeOut get;set;public string StrPError get;set;public PLCHelper(SerialPort mserPort,int mTimeOut)(this.SerPort=mserPort;this.IntTimeOut=mTimeOut;)/CRC校验public byte CRC16(byte bytData)(byte numArray=new bytebytData.Length+2;int max Value=(int)ushort.Max Value;int numl=40961;for(int index 1=0;index 1 bytData.Length;+indexl)(max Value A=(int)bytDataindexl;for(int index2=0;index2 8;+index2)(int num2=max Value&1;max Value=1;if(num2=1)max Value A=numl;)Array.Copy(Array)bytData,0,(Array)numArray,0,bytData.Length);numArraynumArray.Length-2=(byte)(maxValue&(int)byte.MaxValue);numArraynumArray.Length-1=(byte)(maxValue 8);return numArray;)public byte stringToBytes(string strValue)(strValue=strValue.Replace(n n,nn);byte numArray=new bytestrValue.Length/2;for(int startindex=0;startindex strValue.Length;startindex+=2)numArraystartindex/2=Convert.ToByte(strValue.Substring(startIndex,2),16);return numArray;)初始化端口2实现C#与信捷PLC通讯public bool Plc_Ini(string strCom)(try(if(this.SerPort.IsOpen)this.SerPort.CloseQ;this.S erPort.PortN ame=strCom;this.SerPort.B audRate=19200;this.SerPort.DataBits=8;this.SerPort.Parity=Parity.Even;this.S erPort.StopB its=StopBits.One;this.S erPort.ReadT imeout=2000;this.S erPort.Open();return true;)catch(Exception ex)(this.StrPError=初始化PLC通讯端口 错误:+ex.Message;return false;)public string byteToHexStr(byte bytes)(string str=string.Empty;if(bytes!=null)(for(int index=0;index 0)(TimeSpan timeSpan=DateTime.Now-now;if(timeSpan.Milliseconds=6)(byte bytes2=new byteintCount;if(buffer2l=(byte)1&(int)buffer!2=(int)(byte)intCount)(for(int index=0;index 0)(TimeSpan timeSpan2=DateTime.Now-now;if(timeSpan2.Milliseconds=6)(flag=this.byteToHexStr(numArray2)=this 上 yteToHexStr(numArrayl);)else(this.StrPError=写取寄存器:+intAddr.ToStringO+”反馈数据长度不够:+numArray2.Length.ToString();flag=false;)else(this.StrPError 二”写取寄存器:”+intAddr.ToStringO+”数据超时:“+5实现C#与信捷PLC通讯timeSpan2.Milliseconds.ToString();flag=false;)else(flag=false;this.StrPError=PLC未反馈数据帧”;)elseflag=false;)catch(Exception ex)(flag=false;)return flag;)读取D寄存器public bool Read_D(int intAddr,string strRType,int intCount,ref string strSendStr,ref string strRecStr,ref string strValue)(strValue=new string intCount;bool flag;try(byte bytData=new byte6(byte)1,(byte)3,(byte)0,(byte)0,(byte)0,(byte)0);byte bytes 1=this.stringToBytes(intAddr.ToString(nX2n).PadLeft(4,*0*);bytData2=bytes l0;bytData3=bytesll;bytData4=(byte)0;bytData5=!(strRType=0)?(byte)2:(byte)Convert.ToInt32(intCount.ToString(),16);byte numArrayl=this.CRC 16(bytData);this.SerPort.DiscardlnBufferQ;this.SerPort.Write(numArray 1,0,numArray 1.Length);strSendStr=this 上 yteToHexStr(numArrayl);DateTime now=DateTime.Now;Thread.Sleep(l 00);int bytesToRead=this.SerPort.BytesToRead;if(bytesToRead 0)6实现C#与信捷PLC通讯TimeSpan timeSpan=DateTime.Now-now;if(timeSpan.Milliseconds=7)(byte bytes2=!(strRType=H0n)?new byte4:new byte2;if(numArray2l=(byte)3&(strRType=H0H&(int)num Array 2 2=2*intCount|strRType=Hln&numArray!2=(byte)4)(for(int index=0;index 0)(TimeSpan timeSpan2=DateTime.Now-now;8实现C#与信捷PLC通讯if(timeSpan2.Milliseconds=8)(flag=this.byteToHexStr(numArray2)=this.by teT oHexStr(numArray 1);)else(this.StrPError=写取寄存器:+intAddr.ToStringO+”反馈数据长度不够:+numArray2.Length.ToString();flag=false;)else(this.StrPError 二”写取寄存器:+intAddr.ToStringO+”数据超时:“+timeSpan2.Milliseconds.ToString();flag=false;)else(flag=false;this.StrPError=PLC未反馈数据帧”;)elseflag=false;)catch(Exception ex)(flag=false;)return flag;public string GetHexOrder(string strHex,int intValue)(string empty=string.Empty;return(Convert.ToInt32(strHex,16)+intValue).ToString(nX4n);)关闭public bool PLC_Close()(try(this.SerPort.DiscardInBuffer();this.SerPort.Close();this.SerPort.Dispose();return true;)catch(Exception ex)9实现C#与信捷PLC通讯return false;)附录Modbus通讯地址可编程控制器内部软元件编号与对应的Modbus地址编号如下表示:1)XD1、XD2、XD3、XL1、XL3系PLC的Modbus地址与内部软元件对照表:注意:X、Y的Modbus地址计算详见表格最底部注意点。类型元件 符号元件编号个 数Modbus地址(十六进制)Modbus地址(十进制)线 圈、位 对 象MM0 M7999800001F3F0-7999XX0X77(本体)645000503F2048020543X10000-X10077(#1 模块)645100513F2073620799X10100-X10177(#2 模块)645140517F2080020863X10200X10277(#3 模块)64518051BF2086420927X10300X10377(#4 模块)6451co5IFF2092820991X10400X10477(#5 模块)645200523F2099221055X10500X10577(#6 模块)645240527F210562n 19X10600X10677(#7 模块)64528052BF2n20 2n83X10700X10777(#8 模块)6452C0-52FF2 n 8421247X11000-X11077(#9 模块)645300533F21248213nX1H00X11177(#10 模块)645340537F2131221375X20000X20077(#1 BD)6458D0 590F2273622799X20100X20177(#2 BD)645910594F2280022863X30000X30077(#1 ED)645BF0 5c2F2353623599YY077(本体)646000603F2457624639Y10000-Y10077(#1 模块)646100613F2483224895Y10100-Y10177(#2 模块)646140617F2489624959Y10200Y10277(#3 模块)646180 61BF2496025023Y10300Y10377(#4 模块)6461C0-61FF2502425087Y10400Y10477(#5 模块)646200623F2508825151Y10500Y10577(#6 模块)646240627F2515225215Y10600Y10677(#7 模块)64628062BF2521625279Y10700-Y10777(#8 模块)6462co 62FF252802534310实现C#与信捷PLC通讯类型元件 符号元件编号个 数Modbus地址(十六进制)Modbus地址(十进制)Y11000-Y11077(#9 模块)646300633F2534425407YU 100Y11177(#10 模块)646340637F2540825471Y20000Y20077(#1 BD)6468D0 690F2683226895Y20100Y20177(#2 BD)646910694F2689626956Y30000Y30077(#1 ED)646BF0 6c2F2763227695SSOS10231024700073FF2867229695SMSMO SM204720489000-97FF36864389nTTO T575576A000A23F4096041535CCO C575576B000B23F4505645631ETETO ET3132C000-C01F4915249183SEMSEMO SEM3132C080C09F49280493 n川媪HMO HM959960C100 C4BF4940850367HS刈HSO HS127128D900D97F5555255679HFIHTO HT9596E100-E15F5760057695HUHCO HC9596E500E55F5862458719hsLHSCO HSC3132E900E91F5964859679寄 存 器、字 对 象DDO D7999800001F3F0-7999IDIDOID99(本体)100500050632048020579ID10000ID10099(#1 模块)100510051632073620835ID10100-ID10199(#2 模块)1005164 51c72083620935ID10200ID10299(#3 模块)10051c8522B2093621035ID10300ID10399(#4 模块)100522c 528F210362n35ID10400ID10499(#5 模块)100529052F32n36 21235ID10500ID10599(#6 模块)10052F453572123621335ID10600ID10699(#7 模块)100535853BB2133621435ID10700ID10799(#8 模块)10053BC 541F2143621535ID10800ID10899(#9 模块)100542054832153621635ID10900ID10999(#10 模块)100548454E72163621735ID20000ID20099(#1 BD)10058D0 59332273622835ID20100ID20199(#2 BD)100593459972283622935ID30000ID30099(#1 ED)1005BF0 5c532353623635寄 存 器、字 对 象QDQD0QD99(本体)100600060632457624675QD10000QD10099(#1 模块)1006100-61632483224931QD10100QD10199(#2 模块)1006164 61c72493225031QD10200QD10299(#3 模块)10061c8622B2503225131QD10300QD10399(#4 模块)100622c 628F2513225231QD10400QD10499(#5 模块)100629062F32523225331QD10500QD10599(#6 模块)10062F463572533225431QD10600QD10699(#7 模块)100635863BB2543225531QD10700QD10799(#8 模块)10063BC 641F2553225631QD10800QD10899(#9 模块)100642064832563225731QD10900QD10999(#10 模块)100648464E72573225831QD20000QD20099(#1 BD)10068D0 69332683226931QD20100QD20199(#2 BD)100693469972693227031QD30000QD30099(#1 ED)1006BF0 6c532763227731SDSDO SD20472048700077FF2867230719TDTD0 TD5755768000823F3276833343CDCD0 CD5755769000923F368643743911实现C#与信捷PLC通讯类型元件 符号元件编号个 数Modbus地址(十六进制)Modbus地址(十进制)ETDETDO ETD3132A000-A01F4096040991HDHDO HD9991000A080A4674108842087HSD1HSDO HSD499500B880BA734723247731HTDHTDO HTD9596BC80 BCDF4825648351HCDHCDO HCD9596C080C0DF4928049375HSCDHSCDO HSCD3132C480C49F5030450335FD2FDO FD5 n95120C4co D8BF5036855487SFDX2SFDO SFD19992000E4co EC8F5856060559FS2FSOFS4748F4co F4EF62656627032)XD5、XDMx XDC、XD5E、XDME、XL5、XL5E、XLME 系列 Modbus 地址与内部软元件对照表:类型元件 符号元件编号个数Modbus地址(十六进制)Modbus地址(十进制)线圈、位对象MM0 M204792048004FFF0-20479XX0X77(本体)645000503F2048020543X10000X10077(#1 模块)645100-513F2073620799X10100-X10177(#2 模块)645140517F2080020863X10200X10277(#3 模块)64518051BF2086420927X10300X10377(#4 模块)6451co5IFF2092820991X10400X10477(#5 模块)645200523F2099221055X10500X10577(#6 模块)645240527F2105621n9X10600X10677(#7 模块)64528052BF2n20 21183X10700X10777(#8 模块)6452co 52FF2n84 21247X11000-X11077(#9 模块)645300533F21248213nX11100-X11177(#10 模块)645340537F2131221375X11200-X11277(#11 模块)64538053BF2137621439X11300-X11377(#12 模块)6453C0-53FF2144021503X11400XH477(#13 模块)645400543F2150421567XH500XH577(#14 模块)645440547F2156821631X11600-X11677(#15 模块)64548054BF2163221695X11700-X11777(#16 模块)6454co 54FF2169621759X20000X20077(#1 BD)6458D0 590F2273622799X20100X20177(#2 BD)645910594F2280022863X30000X30077(#1 ED)645BF0 5c2F2353623599YY077(本体)646000603F2457624639Y10000-Y10077(#1 模块)646100613F2483224895Y10100-Y10177(#2 模块)646140617F2489624959Y10200Y10277(#3 模块)646180 61BF2496025023Y10300Y10377(#4 模块)6461C0-61FF2502425087Y10400Y10477(#5 模块)646200623F2508825151Y10500Y10577(#6 模块)646240627F2515225215Y10600Y10677(#7 模块)64628062BF2521625279Y10700Y10777(#8 模块)6462co 62FF2528025343Y11000-Y11077(#9 模块)646300633F2534425407Y11100-Y11177(#10 模块)646340637F2540825471Y11200Y11277(#11 模块)64638063BF254722553512实现C#与信捷PLC通讯类型元件 符号元件编号个数Modbus地址(十六进制)Modbus地址(十进制)YH300YH377(#12 模块)6463co 63FF2553625599Y11400-Yl 1477(#13 模块)646400643F2560025663Y11500-Yl 1577(#14 模块)646440647F2566425727Y11600-Yl 1677(#15 模块)64648064BF2572825791Y11700-Yl 1777(#16 模块)6464co 64FF2579225855Y20000Y20077(#1 BD)6468D0 690F2683226895Y20100Y20177(#2 BD)646910694F2689626956Y30000Y30077(#1 ED)646BF0 6c2F2763227695SSOS7999800070008F3F2867236671SMSMO SM409540969000-9FFF3686440959TTO T40954096A000-AFFF4096045055CCO C40954096B000BFFF4505649151ETETO ET3940C000C0274915249191SEMSEMO SEM127128C080COFF4928049407HM1HMO HM61436144C100 D8FF4940855551HS1HSO HS9991000D900DCEF5555256551HLHTO HT10231024E100 E4FF5760058623hLHCO HC10231024E500E8FF5862459647HSCiHSCO HSC3940E900E9275964859687寄 存 器、字 对 象DDO D204792048004FFF0-20479IDIDOID99(本体)100500050632048020579ID10000-ID10099(#1 模块)100510051632073620835ID10100-ID10199(#2 模块)100516451c72083620935ID10200ID10299(#3 模块)10051c8522B2093621035ID 1O3OO-ID10399(#4 模块)100522c 528F210362n35ID 10400-ID10499(#5 模块)100529052F32n36 21235ID10500ID10599(#6 模块)10052F453572123621335ID10600ID10699(#7 模块)100535853BB2133621435ID10700-ID10799(#8 模块)10053BC 541F2143621535ID10800ID10899(#9 模块)100542054832153621635ID10900ID10999(#10 模块)100548454E72163621735ID 11000ID 11099(#11 模块)10054E8 554B2173621835ID11100-ID11199(#12 模块)100554c 55AF2183621935ID11200-ID11299(#13 模块)10055B0 56132193622035ID11300-ID11399(#14 模块)100561456772203622135ID11400-ID11499(#15 模块)100567856DB2213622235ID11500-ID11599(#16 模块)10056DC 573F2223622335ID20000ID20099(#1 BD)10058D0 59332273622835ID20100ID20199(#2 BD)100593459972283622935ID30000ID30099(#1 ED)1005BF0 5c532353623635QDQDOQD99(本体)1006000-60632457624675QD10000QD10099(#1 模块)100610061632483224931QD10100QD10199(#2 模块)1006164 61c72493225031QD10200QD10299(#3 模块)10061c8622B2503225131QD10300QD10399(#4 模块)100622c 628F2513225231QD10400QD10499(#5 模块)100629062F32523225331QD10500QD10599(#6 模块)10062F463572533225431QD10600QD10699(#7 模块)100635863BB254322553113实现C#与信捷PLC通讯类型元件 符号元件编号个数Modbus地址(十六进制)Modbus地址(十进制)QD10700QD10799(#8 模块)10063BC 641F2553225631QD10800QD10899(#9 模块)100642064832563225731QD10900QD10999(#10 模块)100648464E72573225831QD11000-QD11099(#11 模块)10064E8 654B2583225931QDIHOOQD1H99(#12 模块)100654c 65AF2593226031QD11200-QD11299(#13 模块)10065B0 66132603226131QD11300QD11399(#14 模块)100661466772613226231QDH400QDH499(#15 模块)100667866DB2623226331QD11500-QD11599(#16 模块)10066DC 673F2633226431QD20000QD20099(#1 BD)10068D0 69332683226931QDQD20100QD20199(#2 BD)100693469972693227031QD30000QD30099(#1 ED)1006BF0 6c532763227731SDSD0 SD409540967000-7FFF2867232767TDTD0 TD409540968000-8FFF3276836863CDCD0 CD4095409690009FFF3686440959ETDETD0 ETD3940A000A0274096040999HDHD0 HD61436144A080B87F4108847231HSD由HSD0 HSD10231024B880BC7F4723248255HTD却HTD0 HTD10231024BC80 C07F4825649279HCD1HCD0 HCD10231024C080C47F4928050303HSCDHSCD0 HSCD3940C480C4A75030450343FD2FD0-FD81918192C4co E4BF5036858559sfdX2SFD0 SFD40954096E4co F4BF5856062655FS2FSOFS4748F4co F4EF62656627033)XDH系列Modbus地址与内部软元件对照表:类型元件 符号元件编号个数Modbus地址(十六进制)Modbus地址(十进制)线 圈、位 对 象MM0 M2047920480。4FFF0-20479XX0X77(本体)645000503F2048020543X10000-X10077(#1 模块)645100-513F2073620799X10100-X10177(#2 模块)645140517F2080020863X10200X10277(#3 模块)645180-51BF2086420927X10300-X10377(#4 模块)6451co 5 IFF2092820991X10400X10477(#5 模块)645200523F2099221055X10500X10577(#6 模块)645240527F21056-21119X10600-X10677(#7 模块)64528052BF21120-21183X10700-X10777(#8 模块)6452co 52FF2n84 21247X11000-X11077(#9 模块)645300533F21248213nXII100XH177(#10 模块)645340537F2131221375X11200X11277(#11 模块)64538053BF2137621439X11300-X11377(#12 模块)6453co 53FF21440-21503XH400XH477(#13 模块)645400543F2150421567X11500-X11577(#14 模块)645440547F2156821631XH600XH677(#15 模块)64548054BF2163221695X11700-X11777(#16 模块)6454co 54FF2169621759X20000X20077(#1 BD)6458D0 590F2273622799YY077(本体)646000603F245762463914实现C#与信捷PLC通讯类型元件 符号元件编号个数Modbus地址(十六进制)Modbus地址(十进制)Y10000-Y10077(#1 模块)646100-613F2483224895Y10100-Y10177(#2 模块)646140617F2489624959Y10200Y10277(#3 模块)646180 61BF2496025023Y10300Y10377(#4 模块)6461C0-61FF2502425087Y10400Y10477(#5 模块)646200623F2508825151Y10500Y10577(#6 模块)646240627F2515225215Y10600Y10677(#7 模块)64628062BF2521625279Y10700Y10777(#8 模块)6462co 62FF2528025343YY11000-Y11077(#9 模块)646300633F2534425407Y1H00Y1H77(#10 模块)646340637F2540825471YH200YH277(#11 模块)64638063BF2547225535YH300YH377(#12 模块)6463co 63FF2553625599YH400YH477(#13 模块)646400643F2560025663Y11500-Y11577(#14 模块)646440647F2566425727YH600Y11677(#15 模块)64648064BF2572825791YH700YH777(#16 模块)6464co 64FF2579225855Y20000Y20077(#1 BD)6468D0 690F2683226895SS0-S799980007000-8F3F2867236671SMSMO SM409540969000-9FFF3686440959TTO T40954096A000AFFF4096045055CCO C40954096B000BFFF4505649151ETETO ET3940C000-C0274915249191SEMSEM0 SEM127128C080-C0FF4928049407HMHM0 HM61436144C100 D8FF4940855551HS1HSO HS9991000D900DCEF5555256551HLHT0 HT10231024E100 E4FF5760058623HC刈HC0 HC10231024E500E8FF5862459647HSCiHSCO HSC3940E900E9275964859687寄 存 器、字 对 象DDO D204792048004FFF0-20479IDID0ID99(本体)100500050632048020579ID10000-ID10099(#1 模块)100510051632073620835ID10100-ID10199(#2 模块)100516451c72083620935ID10200ID10299(#3 模块)10051c8522B2093621035ID10300ID10399(#4 模块)100522c 528F210362n35ID10400ID10499(#5 模块)100529052F32n36 21235ID10500ID10599(#6 模块)10052F453572123621335ID10600ID10699(#7 模块)100535853BB2133621435ID10700-ID10799(#8 模块)10053BC 541F2143621535ID10800ID10899(#9 模块)100542054832153621635ID10900ID10999(#10 模块)100548454E7216
展开阅读全文