施耐德plc与上位通讯

上传人:ni****g 文档编号:484663070 上传时间:2023-04-16 格式:DOC 页数:7 大小:104KB
返回 下载 相关 举报
施耐德plc与上位通讯_第1页
第1页 / 共7页
施耐德plc与上位通讯_第2页
第2页 / 共7页
施耐德plc与上位通讯_第3页
第3页 / 共7页
施耐德plc与上位通讯_第4页
第4页 / 共7页
施耐德plc与上位通讯_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《施耐德plc与上位通讯》由会员分享,可在线阅读,更多相关《施耐德plc与上位通讯(7页珍藏版)》请在金锄头文库上搜索。

1、施耐德PLC 电脑编程示例说明一、 应用程序1. 目录:Projects_delphitcpip_thread,2. 画面:3. 按钮功能说明:1) read按钮:读PLC中address地址的值。2) write按钮:将画面中id值写入到PLC中的address地址里。3) thread start按钮:启动PLC线程。当wr_mk0时,将address地址作为起始地址,读取100个长度的地址值;当wr_mk0时,将画面中id值写入到PLC中的地址里,address作为起始地址。4) batch write按钮:批量写入。no of address为plc地址个数,address为PLC起始

2、地址,number in every address为需要写入到plc地址中的值,可输入批量进行写入。二、 写PLC说明(16 (10 Hex) Preset Multiple Registers)1. 画面:2. 部分源码StaNo:=strtoint(edit2.Text)-1; /PLC地址 IDNo:= strtoint(edit3.Text); /ID值 stnaddr:=inttohex(StaNo,4); /将地址转换为16进制,4位bte1:=hextodec(copy(stnaddr,1,2); /取地址高2位 bte2:=hextodec(copy(stnaddr,3,2)

3、; /取地址低2位 idstr:=inttohex(idno,4); /将ID转换为16进制,4位 bte3:=hextodec(copy(idstr,1,2);/取ID高2位 bte4:=hextodec(copy(idstr,3,2);/取ID低2位 TcpClient1.Active:=true;SendString := #0+#1+#0+#0+#0+#$9+#$FF+#$10+chr(bte1)+chr(bte2)+#0+#1+#2+chr(bte3)+chr(bte4);TcpClient1.Sendln(SendString) ;3. 源码说明得到输入的地址和id值,并转换为4位

4、的16进制数,然后根据PLC定义的发送字符串的格式,发送写PLC字符串,以写入到PLC中。SendString字符串说明:#0+#1+#0+#0+#0 固定格式#$9 字符个数#$FF 固定#$10 功能码((10 Hex) Preset Multiple Registers),固定chr(bte1)+chr(bte2) 起始的地址序号,地址号1#2 共几个字节,两个字符chr(bte3)+chr(bte4) (具体写入的值)#0 aci=0 的字符, #$FF aci=$FF=255 的字符#2+#$58 h258=600 hi low FF FF 00ff 255就有高位 一次写三个地址S

5、endString := #0+#1+#0+#0+#0+#$D+#$FF+#$10+chr(bte1)+chr(bte2)+#0+#3+#6+chr(bte3)+chr(bte4)+chr(bte5)+chr(bte6)+chr(bte7)+chr(bte8); 三、 读PLC说明(03 Read Holding Registers)1. 画面2. 部分源码StaNo:=strtoint(edit2.Text)-1; IDNo:= strtoint(edit3.Text); stnaddr:=inttohex(StaNo,4); bte1:=hextodec(copy(stnaddr,1,2)

6、; bte2:=hextodec(copy(stnaddr,3,2); idstr:=inttohex(idno,4); bte3:=hextodec(copy(idstr,1,2); bte4:=hextodec(copy(idstr,3,2); TcpClient1.Active:=true; SendString := #0+#0+#0+#0+#0+#6+#$ff+#3+chr(bte1)+chr(bte2)+#0+#$64;TcpClient1.Sendln(SendString) ; TcpClient1.ReceiveFrom(buf, 209,TcpClient1.GetSock

7、etAddr(TcpClient1.RemoteHost,TcpClient1.RemotePort),n,0);3. 源码说明得到输入的address地址,并转换为4位的16进制数,然后根据PLC定义的发送字符串的格式,发送读PLC字符串,然后通过TcpClient1.ReceiveFrom函数接收PLC的反馈信息。SendString字符串说明:#0+#0+#0+#0+#0 固定格式#6,从FF开始之后的字符个数#0 aci=0 的字符, #$FF aci=$FF=255 的字符 $FF,固定写入#3 功能码(read holding registers),固定#2(高位) #$57(底位

8、) H 0257 = D(599) ,读的起始地址属于第几个地址,不是绝对地址,从D600读,就是读第599个地址#0(高位) #$64(底位) H 0064 = D(100) ,读取地址的长度 #2+#$58 h258=600 hi low FF FF 00ff 255就有高位TcpClient1.ReceiveFrom(buf, 209,TcpClient1.GetSocketAddr(TcpClient1.RemoteHost,TcpClient1.RemotePort),n,0);为固定格式,不需更改。四、 PLC反馈信息说明1. 部分源码:接上面读PLC源码: recstr:=; f

9、or i:=1 to 100 do begin m:=i+99; num:=256*ord(bufi*2 + 8) + ord(bufi*2 + 9); num1:=10000+num ; recstr:=recstr+copy(inttostr(num1),2,4); end; edit1.Text:=recstr;2. 源码说明:PLC的反馈信息为4位16进制的数,通过以上函数进行高低位转换,将PLC地址中的值以10进制的数字显示在edit1中。ord(bufi*2 + 8)为高位,ord(bufi*2 + 9)为低位。当数字小于256时,在PLC中高位为0,低位为该数字的ASCII字符;

10、当数字大于256时,在PLC中高位数字为256的整数倍数值,低位为该数字减去256整数倍后的尾数值。u 如十进制数字107:由于小于256,故在PLC反馈的信息中,高位为#0,低位为k(107为k的ASCII值)。u 如十进制数字2528:由于大于256,故在PLC的反馈信息中,高位为#9(2528除以256约等于9.875,取整数值),低位为#224(2528256*9224)。故将PLC反馈信息读出并显示出来是就需要做256*ord(bufi*2 + 8) + ord(bufi*2 + 9)处理才可以正确显示出十进制的数字来。C# code /开始按钮事件 private void but

11、ton1_Click(object sender, System.EventArgs e) /取得预保存的文件名 string fileName=textBox3.Text.Trim(); /远程主机 string hostName=textBox1.Text.Trim(); /端口 int port=Int32.Parse(textBox2.Text.Trim(); /得到主机信息 IPHostEntry ipInfo=Dns.GetHostByName(hostName); /取得IPAddress IPAddress ipAddr=ipInfo.AddressList; /得到ip IP

12、Address ip=ipAddr0; /组合出远程终结点 IPEndPoint hostEP=new IPEndPoint(ip,port); /创建Socket 实例 Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); try /尝试连接 socket.Connect(hostEP); catch(Exception se) MessageBox.Show(连接错误+se.Message,提示信息 ,MessageBoxButtons.RetryCancel,Mes

13、sageBoxIcon.Information); /发送给远程主机的请求内容串 string sendStr=GET / HTTP/1.1rnHost: + hostName + rnConnection: Closernrn; /创建bytes字节数组以转换发送串 byte bytesSendStr=new byte1024; /将发送内容字符串转换成字节byte数组 bytesSendStr=Encoding.ASCII.GetBytes(sendStr); try /向主机发送请求 socket.Send(bytesSendStr,bytesSendStr.Length,0); cat

14、ch(Exception ce) MessageBox.Show(发送错误:+ce.Message,提示信息 ,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); /声明接收返回内容的字符串 string recvStr=; /声明字节数组,一次接收数据的长度为1024字节 byte recvBytes=new byte1024; /返回实际接收内容的字节数 int bytes=0; /循环读取,直到接收完所有数据 while(true) bytes=socket.Receive(recvBytes,recvBytes.Length,0); /读取完成后退出循环 if(bytes=0) break; /将读取的字节数转换为字符

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 小学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号