西门子模块6ES7214-1AD23-0XB8全年质保
背景:
我们现在做锅炉节能控制,都是在原有的控制系统上加上西门子的控制器,把我们的算法写在西门子控制器中,通过通讯的方式读取第三方系统的数据运算后把控制指令再发回去。因为第三方系统使用的系统不同,目前比较多的如abb,施耐德,ge,上海新华,和利时,浙大中控等,为了实现和这些系统做的控制系统,就要有一个比较合理的通讯方式,目前采用的是opc方式通讯。
目前采用的通讯方式:
目前采用opc方式,锅炉也是采用母管制的,要把整个母管中链接的锅炉的数据都采集过来才好,这样数据两比较大,在大量数据交换的情况下,速度比较好。我们现在在向大型锅炉控制上转型,大型锅炉都是一炉一机的,针对我们的现在的要求不太合适,我们的特点是需要交换的数据量小多两三百点,要求速度快。我们目前的通讯方式是用pc和第三方系统通讯pc和通讯,pc中用wincc把读取到的数据转写到plc的变量中,wincc中如果脚本执行的速度过快,则影响到wincc的其他的功能,目前快也就是1s的周期。
目前的技术需求:
而针对一炉一机这种数据量小,要求速度快的通讯特点,modbus通讯方式更合适,modbus是比较早的通讯协议,大多数的智能仪表都支持,控制系统也都支持,不存在无法通讯的难点。为了实现这个通讯,我于2014年的年底在江苏阜宁澳洋热电厂做了测试。
项目硬件需求:
江苏阜宁澳洋热电厂采用的是和利时的控制系统,因为我们的控制思路是在原有控制系统基础上做的程序,硬件中不包含io模块采用西门子ps407,400控制器以及cp441通讯模块。网上采购232通讯接头,自制232通讯线。
硬件组态:
硬件组态很简单,只要按照说明资料一步步操作就可以了,这里没有什么好说的。
遇到的问题:
1、接线。网上搜索到的232接线图:
按照这个接线图连接后无法通讯,后来我考虑到modbus的通讯需要告诉对方是否准备还收发数据以及是否收发结束,应该状态也发给对方才行,把上面的接线图改成:
实现了硬件连接,可以通讯了。
2、通讯格式设置:
大家都知道西门子的数据存储格式和其他的公司有点不一样,西门子是低字高位,其他公司大多数都是采用的高字高位,如果只是传输字节的话,两者是没有区别的,如果用modbus传输32位的数据就需要注意这个问题了,因为modbus只是原封不动的把药传输的32位地址的数据传过去,具体这些位中式什么它不管的,如果没有注意到这个高低位的问题,很有可能你都不知道传过去的是什么。对方能够实现换位功能,则只要采用4321的数据格式就行了,否则就要我们手动把需要传输的数据在传输前或者接收后进行换位操作。次使用没有注意这个问题,通讯后的数据全变了,后来换位后正常了。
3、处理:
在实际测试使用过程中处理了前面说的问题后,又遇到了新的问题。实数,整数都能正确通讯,只有bool量无法通讯,只要增加bool量,则第三方系统报错,通讯中断,咨询技术服务人员也没有解决问题,后来我想既然整数能够正确处理,那么我就把bool量打包成字节按整数传输,这样还省了需要传输的变量数,只是双方都需要编程,发送bool量方打包数据把8个bool量转换成一个字节的整数,接收方再把这个整数分解成8个bool量。
通过以上的处理,终于实现的西门子400控制器通过modbus与和利时dcs系统的通讯。
通过gprs实现组态软件与的modbus通讯,实现无线远距离通讯。
plc采用s7-1200 1212c cpu和cm1241 rs485通讯模块
宏电h7710sgs 485接口 gprs dtu模块,组态软件为紫金桥
对于宏电h7710 的工作原理,是把采集数据的s71200经rs485串口连接到gprs模块上,之后通过模块上的sim卡的网络,走流量连接到internet网中的一个固定ip地址的数据中心server,中心站采用紫金桥实时数据库.
cm1241接口的3和8为rs485通讯正负极,对应连接h7710的3和2端子
这个系统里plc作为从站使用,组态软件为主站。
plc ob1 里始终调用mb_slave块 ,mb_addr 为从站地址,mb_hold_reg 为指向 modbus保持寄存器数据块的指针。
在mb_hold_reg指定的数据块db4中建立要发送的数据
mb_comm_load块 用于组态端口使用 modbus rtu 协议来通信,在ob100里调用一次即可。port 端口号,baud波特率,parity 校验方式,mb_db mb_slave指令的背景数据块的引用。在程序中插入mb_slave之后,数据块标识符会显示在 mb_db 框连接的下拉列表中。
通过以上指令从站plc程序部分基本完成,具备通讯条件。
再简单描述一下上位机设置。
在紫金桥组态软件设备组态中配置所连接的从站设备1200。选择modbus串行通讯,数据读取周期时间设5秒,输入正确plc通讯地址,设置串口通讯格式,配置gprs设备h7710,dtu标识输入手机卡的电话号码。
h7710的具体设置这里就不详细叙述了,不是本文重点。
在紫金桥组态软件点组态中添加mb_hold_reg指定的数据块db4中的数据,这样在组态画面就可以读取从站的数据了。
这个案例主要用于实现无线远距离数据采集.
有错误不足之处欢迎指正吐槽。
发个故事也是一波三折,刚都快写完了,360浏览器崩溃,写的东西全没了,无奈,只能重新来过。
12年自动化毕业后,留在了一个钢厂工作,接触的便是西门子的,接触的协议自然也是profibusdp、mpi、ppi、tcp/ip等与西门子相关的协议,对于modbus,仅仅停留在听说过,好像很厉害的层面上,一次偶然的机会,接触到了modbus协议,项目是300plc通过pb-b-modbus总线桥(北京鼎实)与modbus从站通讯,plc选择的是西门子cpu313-2dp,从站设备是一台加气机,主站cpu需要读取加气机的状态字及流量温度压力等数据,需要给控制字给加气机。由于之前没有接触过modbus协议及产品,再通读了网上的协议及pb-b-modbus总线桥的产品介绍之后便开始了测试。
1.毫无疑问,需要进行硬件组态的配置:在安装完总线桥的gsd文件后,很轻松完成了组态;
2.我们要明白我们的目的,读写数据,数据存储在什么地方?怎么读取和写入?硬件组态方面还需要怎么组态?读取完数据之后怎么处理?
上图显示的是加气机设备modbus协议的一小部分,以lng出口温度为例,对每个数据进行解释,0x0035、0x0036指的是寄存器号,2指的是寄存器数目,int32指的是数据类型,0.001指的是单位,r指的是只读,综合上述,我们知道了lng出口温度这个数据存储在40000+53(16进制35转换)-1=40052开始的两个字中,plc读取数据之后需要除以1000以得到正确数值
需要对硬件组态进行组态,双击总线桥,添加一个read 2words模块,并设置好起始地址及其他必要设置,组态完成后如下图
从上图中我们便可以看出,将起始地址设置为52,plc的i地址设置为256-259,便将modbus寄存器40052开始的两个字与plc的pid256对应了起来,行的8di的i地址为2,意味着ib2是总线桥的状态位,qb2是总线桥的控制位:具体含义见下图
这样,我们程序中给定一个启动modbus扫描信号,便可以读到lng出口温度的数据了,读取的数据存储在pid256中,对pid256进行除以1000操作,便可以得到实际出口温度,控制字状态字及其他温度压力等数据都可以通过这样的添加模块方式来进行读写。
通过这个项目,我对modbus协议有了一定的了解,我觉得关键在于组态和地址映射,测试时候可以使用modbus sim和modbusscan软件进行测试,modbus poll和modbusslave也是可以的,使用软件测试完成后,有事半功倍的效果。并且在这次测试完成后,我又完成了s7-200与s7-200smart的modbus通讯测试,还有使用cp343-1通过第三方连接modbus设备的测试,,发现再神秘的东西,只要我们用心去了解它,去剖析它,问题都是变得简单,好事多磨,知识也是这样,它也害怕多磨!