电子商务与网站平台建设的关系,关于网站建设总结,桥头东莞网站建设,建站教程视频下载将之前的画面和代码用复制粘贴的方法复制四份#xff0c;就完成了整个主画面和主程序的基本构建。 下面的工作是关于PLC和通信。 上位机项目#xff0c;其与PLC通信的模式很多都是这样的#xff1a;在没有操作和设置的平常显示界面#xff0c;按照预定周期从PLC读取当前页…将之前的画面和代码用复制粘贴的方法复制四份就完成了整个主画面和主程序的基本构建。 下面的工作是关于PLC和通信。 上位机项目其与PLC通信的模式很多都是这样的在没有操作和设置的平常显示界面按照预定周期从PLC读取当前页面需要刷新的部件的数据字节并对字节进行解码和刷新。当有了设置和改变的动作需要改写PLC的内部数据时把需要改写的地址和数据发送给PLC。 查阅了很多资料关于上位机与PLC通信这块大多数都是针对西门子的并且使用了Snap7。使用Snap7确实可以使问题简化但是如果PLC不是西门子品牌就无能为力了。即使是西门子PLC还要对PLC的内部寄存器地址、指针、语句编程这些知识进行深入学习才能灵活应用。像我这样的以搞控制为主的PLC和上位机编程都只是简单用用的人就感觉很吃力。一句题外话玩了三十年工控到目前为止PLC程序也做过上千个了大多数时候都还是梯形图和直接地址访问每每看到那些大公司的专业PLC编程工程师熟练地使用间接寻址和语句编程都觉得很汗颜。所以这里采用了通用的tcp ip的socket通信模式自定义报文直接地址读写好处是提高了通用性、降低了技术难度坏处是PLC端需要额外编写一些通信程序不过PLC的程序全部都是直接地址访问用不到考虑指针和寄存器地址映射之类的编程也可以用梯形图属于简单劳动。 既然是自定义报文每个人完全可以根据PLC的品牌型号以及自己的习惯来约定报文的内容。我这里的范例上位机发送到PLC的报文采用固定长度每个报文长度12个字节前6个字节是功能码后面4个字节是数据内容最后2个字节与第一第二个字节内容相同作为结束符用来断帧和校验防止TCP数据粘连。 1、对PLC的例行的周期查询报文第1、2字节为字符“A0”第3字符是画面编号第4、5是对应的周期第6是周期时间的单位7-10字节用字符“0”填充11、12与第1、2字节相同为字符“A0”。例如报文A0101S0000A0其含义是编号1的画面一秒周期的查询。至于本次需要查询哪些部件的变量这些变量的类型和字节长度都是提前规划好并在PLC端写好了对应的子程序当PLC端收到报文并且报文头6字节与字符串“A0101S”比对成功报文的第11、12字节与字符串“A0”比对成功就执行相应的子程序把上位机需要的地址的内容复制到PLC的通信发送缓冲区打包并发送至上位机上位机收到返回的数据后按照提前规划的变量的类型和字节长度解码并刷新显示界面。 总之所有的需要查询的内容都是已知和提前规划的PLC端只需要比对收到的报文字符串前6个字节和第11、12 字节调用对应的子程序将需要的地址的数据复制到送缓冲区打包发送。 举例画面2每10秒钟需要读取PLC的MW10、VD100、QB0这几个变量那么每隔10秒钟发送报文字符串“A0210S0000A0”到PLCPLC收到报文前6个字节与“A0210S”比对成功第11、12字节与字符串“A0”比对成功执行对应的子程序将MW10、VD100、QB0这几个变量的值写入发送缓冲区打包并发送至上位机。上位机收到返回数据按照提前规划的“整数、实数、字节”即MW10、VD100、QB0这几个变量的类型的顺序解码数据并分配刷新各个部件。由于采用了约定自定义报文的方式PLC端对所有地址的操作都是直接的地址访问用不着考虑寄存器实际地址和指针不同的PLC上位机的报文也是通用的唯一需要考虑大小端编码。 另各个周期的查询内容是长周期包含短周期例如10秒周期的查询包含了1秒周期的查询内容。 2、对PLC的写操作由于本例项目很小需要写的数据并不多所以也采用了约定报文的方式如果数据量较大这种方式就不太方便必须用到指针了。话又说回来之所以费劲巴交地自己写代码就是因为项目小利润低没法用正版scada如果是数据很多的大项目有足够的利润支撑就直接用正版wincc、组态王了那功能又强大使用又简便。至于盗版嘛看您高不高兴了不在讨论范围内。 言归正传本例中对PLC的写操作第1、2字节为字符“B0”第3、4字节为事件编号例如可以将“启动/停止缓凝剂“事件定义为01事件5、6字节用字符0填充7、8、9、10字节为数据内容这里的数据内容之所以用了4个字节是因为有可能传输的最长数据格式是浮点数长度为4个字节。对于长度小于4个字节的数据类型靠前的字节为有效数据后面的用b\x00填充。第11、12字节为字符“B0”与第1、2字节相同作为结束符用来断帧和校验防止TCP数据粘连。 当PLC收到报文后并且第1、2字节和第11、12字节与字符”B0“比对成功就读取第3、4字节的事件编号执行相应编号的子程序执行约定的操作。 举例上位机发送报文bB001\x00\x00\x01\x00\x00\x00B0这个报文的开头和结尾为B0表示要对PLC写操作事件编号为第3、4字节015、6字节无意义第7字节为数据位b\x01将其约定为”启动缓凝剂“在PLC程序里实现该事件的的方法是将Q0.0置位编写并执行该子程序或网络即可。 至此通信报文的基本规划就完成了还可以加入一些别的约定报文例如报警、故障什么的看个人需要了。总结一下本例采用了基于tcp ip协议的socket通信这个叫法貌似不是很专业管他呢我也不是专业的程序员能用就好PLC作为服务器上位机作为客户端。所有的通信均由上位机发起上位机的程序中有系统定时器周期地查询PLC中的数据PLC根据收到的报文内容做出响应并根据约定代码的不同执行不同的子程序或网络对PLC内部数据进行读写和发送。在任何时候上位机发给PLC的报文都是固定长度的报文的首2和末2字节内容相同作为事件定义和断帧校验。tcp通信是基于”流“的就没有严格意义上的”帧“tcp通信的最大隐患就是数据帧长度的不确定性很容易造成接收缓冲区数据排序混乱这也是我之前做过的很多PLC通信项目遇到过的问题固定PLC接收通信数据的长度并把通信报文中加入断帧和校验字符就可以很好地解决这个问题。 下面的工作就是编写实际的程序了。