大家都知道FX2N-485BD是通讯卡,一般用来把PLC和上位机或三菱变频器再或三菱其他工控设备连接。因为这些设备和上位机组态软件都已经有了现成的FXPLC的驱动程序,所以只要只要把什么波特率、数据位、奇偶校验等参数设置一下就能进行通讯。这对于那些水平菜一点的工控人来说是再方便不过了。
我们项目里经常要用到力创公司生产的一种EDA9015模拟量采集模块去读取现场设备的诸如液位、流量、电导率、PH、ORP等数据。之前的做有的是通过AD模块直接读到PLC里面,有的则是通过上位机的力控组态软件和EDA9015模块通讯来读取这些数据(因为力控组态软件有EDA9015模块的驱动程序),再用力控组态软件去控制PLC。前一种做法的弊端是如果模拟量过多,所需的AD模块也多,且所有的信号线都要拉到控制柜来,以致成本大增。后一种做法最大的问题是上位机不稳定,有的项目为了省钱则是用普通电脑代替工控机,配置也不是很高,也没有安装正版系统,经常有死机或硬件坏了的情况,这样PLC得不到数据,整个系统就瘫痪掉了。
为了克服上述问题,我可以将PLC通过FX2N-485BD和EDA9015模块进行通讯,直接把数据读进PLC,又可省去AD模块和拉线的成本。因为EDA9015模块不是三菱产品,这个时候可没有现成的驱动程序可用了,所有的通讯协议都得自己写。
EDA9015模块可同时采集十二路4~20mA电流信号,通讯协议为MODBUS-RUT和ASCII。首先用串口调试软件连接EDA9015模块,按照其规定的协议发送报文,模块马上返回数据,通讯成功,如图:
既然和电脑连接没有问题,那就开始编写程序了。
先定义通讯格式:波特率9600、数据位8、停止位1,然后做一个时间脉冲,这里是一秒钟,在条件满足时执行RS指令。
每隔一秒钟发送如下报文:
后面两个字节是CRC校验码,先算出来填进去。然后置位M8122,M8122是发送标志,这时就开始发送数据了。也就是在执行RS指令了,数据发送完后就接收数据,接收到的数据放到D150到D159十个寄存器里。接收完毕后接收完毕标志M8123置位。利用M8123把所有的点都复位,等下一个脉冲到时重新来。
我把这段小程序下到FX1N的PLC中,用FX1N-485BD连接一个EDA9015模块,通讯很成功。我想既然FX1N没问题,那FX2N应该更没问题吧,因为现场用的都是FX2N机器。
可我到到公司用FX2N来试却傻眼了,通讯卡上的发送和接收的指示灯正常闪着,而接收到的数据却就是发送的数据,EDA9015模块返回的数据却收不到。我又用电脑串口调试对它们各自连接,都能正常发送和接收数据。又用FX1N来试,又正常。于是换通讯卡、换EDA9015模块、加终端电阻、修改地址等等,凡想到的办法都试过了,还是不行。也到网上搜了些东西参考,没用。真是活见鬼了。
唉,问问三菱的客服吧。我把这些情况跟客服人员一说,他先笑了一下,说是有很多人反应过这个问题,FX2N的的回波通讯,就是FX2N-485BD接收到的数据就是发送的数据,这是硬件制作的一缺陷,没办法解决,FX1N就不存在这个问题。
难怪我用FX1N试验没问题,这坑爹的小日本,不但窃占了我们的钓鱼岛,竟还产出这种垃圾货来坑我们。坚决抵制日货!!!
但静下心来一想,总觉得不甘心。如果说硬件有问题,我用电脑串口调试软件去连接,明明可以对其发送和接收数据,为什么连接到EDA9015模块就不行呢?反复看手册,特别是RS指令的时序图,和自己的程序对比,修修改改。冥思苦想几天,老天不负有心人,终于有了结果。
说实话我很不喜欢用三菱的PLC,主要是这个编程软件太不好用了,我所做的项目都将改用西门子的PLC,但我们的客户大多是老客户,的项目是在原先的项目上增加系统,有些数据是和原先的系统共享的。因此我还得想个办法让三菱PLC和西门子PLC通讯起来。还是用MODBUS协议,比竟这是国际上现行最通用的标准协议。
一台FX2N同时连接一台S7-200和一个EDA9015模块
先把西门子S7-200设为MODBUS从站,地址为2,波特率9600、数据位8、停止位1,
用读到的数据驱动输出点
然后就是修改三菱的程序了,通过我坚持不懈的艰难测试,程序最后修改如下:
这里做个计数器,第一次和S7-200通讯,第二次和EDA9015模块通讯,时间间隔为200毫秒。
第一次发送和S7-200通讯的报文,把FX2N的32个输入点的状态发送给S7-200。注意,一定要用M8122来触发报文的发送,这是至关重要的一步,网上资料和三菱客服人员都不明白这一点。特别有些网上或论坛上的人煞有介事说和这个通讯成功和那个通讯成功,其实都是道听途说,人云亦云,自己根本没有动手实践过。
调用子程序P2,P2是计算CRC校验码的子程序,算出来后填到D106和D107里面
再执行RS指令,当报文发送完时M8122,自动复位。
接下来是和EDA9015模块通讯,模块地址设为3。
同样还是要用M8122来触发。
数据接收完后所有点都复位,计算器也复位,如此循环不已。
后面是计算CRC校验码的子程序,关于CRC校验码的计算方法,我之前有专门介绍的文章,在此不再啰嗦,下面只是简单解释一下用梯形图来计算的过程。
用寄存器D1的8位和报文的一个字节进行异或后,右移一位,如果移出位是0,重复异或,如果移出是1,就与生成的多项式异或。因为共要移出8位,所以要循环8次。
把D1里的所有位都置1,D3是要发送的报文的字节数。
D100加变址就是让寄存器D1与每个字节进行异或、移位的运算,故要循环D3次(即6次)
经过这番折腾计算后存于D5,把D5的低字节切下来放到D31,把D5的高字节切下来放到D32,再把D32转换为低字节,这就是CRC校验码了。
好了,通电,接通FX2N的输入点,可以看到S7-200上相应的输出继电器有动作。接一个电位器在EDA9015模块的第十号输入通道上,调节电位器旋扭,可以看到D177和D178的数据会发生变化,这才是真正的通讯成功了。从这件又一次证明了“实践是检验真理的唯一标准”
更多信息请进:http://user.qzone.qq.com/290355167/infocenter#!app=2&via=QZ.HashRefresh&pos=add。
天奇工控 |