先自我介绍一下,96年初中毕业进入制糖企业当电工,04年春由于单位效益不好决定不干了,于是南下在郑州学习计算机网络工程师,以名成绩结业。之后的一年多没有从事电气方面工作,也都不是长期稳定的工作,06年下半年接触PLC编程,07年开始独立进行电气设计,10年10月自己开公司。
从去年12月份到现在一直在做一个能源管理及设备监控的项目,项目简介:工厂内所有用电量,压缩空气,水,这三种能源的消耗,已经做好的十二台由西门子200PLC控制的空调监视,已经做好的冷冻水,冷却水,生产水,生活水等水循环系统内的水泵变频器的电参数监视,今天要讲的故事就是这一块。再说一下还没开始做的电能管理,所有电量表(有许多块,具体数量还没计算)都是已经安装好,并可以在上位机监控的系统,电量表和上位机都是北京爱博精电做的。所有的电量表都支持modbus通信,但是是通过串口服务器用以太网与上位机通信的。而我的系统内是s73152PN,这就要求我用315用以太网读取电量表modbus通信下的各项参数了,若7号之前完成通信,再写篇关于此方面的文章。工程中除电缆桥及电缆的铺设是我指导安装,其它都是我独自完成,包括柜子配线,电气原理图设计,PLC编程,调试。
*近连续工作的好多天,每晚加班到八九点,昨天给客户的串口服务器柜子重新改造一下,是将7处新增加的电能表通过光纤转485连接到串口服务器,恢复客户原有的通信时,晚上八点了,累坏了,所以今天休息,刚刚我的奶奶给我打电话祝我生日快乐,我都把自己生日给忘了。
下面正题:
简介:客户要求对变频器的数据只监不控。客户所有的水泵变频器都是丹弗斯VLTHVAC暖通空调系列变频器,功率有大有小,共有29台,但由于modbus通信上还有4台冷水机组,1个冷冻水加药站,这样从站超过了32台,怕通信不会成功,及其它方面原因,所以在设计之初就采用2台224分开来进行通信,一台带23台变频器及加药站,一台带6台变频器及4台冷水机组,每台224再挂以太网模块与上位机WinCC通信。从200的Micro'nPowerv1.3帮助上知道200的通信口通信距离为50米,所以设计之初就提料买了2台西门子485中继器,这样实际电气隔离。以前在网上看到过文章,多台200通过通信口通信,没使用电气隔离造成200全部损坏,具体原因就不得而知了
实施过程:
1、由于以前没有modbus通信经验,所以过程是非常的艰难。由于我一直用笔记本,没有串口,怕调试时出现麻烦事,所以买了摩莎的UPort-1250IUSB转双串口,次买回来新的啊,指示灯就不好用,又换了一次。在现场把两个串口连起来,使用Modscan32调试工具模拟modbus通信,通信成功,这样有了一个大致的概念。
2、与现场抄表人员沟通(他们公司规定变频器的运行数据进行抄录),确定读取变频器的6个数据,如下:
参数编号名称单位转换指数数据类型
1501运转时间0h74Uint32
1502千瓦时计数器0kWh75Uint32
1610功率[kW]0.00kW1int32
1613频率0.0Hz-1Uint16
1614电动机电流0.00A-2int32
读取变频器的运行状态
线圈01
33控制未就绪控制就绪
34变频器未就绪变频器就绪
35惯性停止安全功能关闭
36无报警报警
37未使用未使用
38未使用未使用
39未使用未使用
40无警告警告
41不在参考值下在参考值下
42手动模式自动模式
43超出频率范围在频率范围内
44已停止运行
45未使用未使用
46无电压警告电压警告
47不在电流极限内电流极限
48无热警告热警告
高低字节互换后,由高到低对应线圈为48----33
关于丹弗斯modbus通信时寄存器地址上的问题。
通过在网上搜索,丹弗斯变频在modbus通信时,寄存时的地址要功能号乘以10减1。如,变频器的频率地址为1613就是1613乘以10减1等16129当然这也造成了我后面的麻烦。这里假设你还不知道西门子200读取时是只乘以10不用减1,这也坑了我一下。
想着先用Modscan32调试工具读取单台变频器试试吧,发现Modscan32不支持《1613乘以10减1》这么大的地址,这怎么办?在网上找啊找,找到一个《CRC16自动计算软件_MODBUS》软件,通过计算出要发送的数据包,通过串口调试软件发给变频器,经过几次调试,通过转换回传回来的数据,发现可以通过计算机串口与变频器通信了。这时用的速率是变频器的115200。
下面就开始在单台PLC编程读取变频器频率。
modbus的MBUS_MSG指令的Addr填写16129,发现无法通信,仔细看那个网上的文档才发现200不需要减1,于是改成16130,发现还是无法读取,这是什么原因?又开始看各种资料。*后在Micro'nPowerv1.3里找到,《ModbusMaster协议库支持超过9999的保持寄存器地址。地址范围为400001-465536》,这样16130肯定是超过9999了,改成416130后,可以通信了。
问题又来了。
这样变频器寄存器的地址就变成了运转时间415010千瓦时计数器415020功率416100,本来寄存器地址就不连续,读起来不方便,这回更是拆成了6个。唉,先编程再说吧。先编的是23台变频器224,编着编着发现编译保存时,输出窗口出现一个警告,说程序太大14000多字节,不适合224,当时就哭了。想想也是23台变频器,每台6条指令,再加上数值的处理,程序量很可观啊,怎么办,首先想到的是换226,付款订226,226在快递中的时候。想到了西门子的指针,想着把变频器的从站地址放入V区,再用指针去读取V区里的变频器的从站地址,读到地址23就返回到1,这样就6条读取指令,可大大减小程序块。可是指针我从来没用过啊,于是看指令方面的知识,看看发现从站地址是字节型,心想能不能每读完一台变频器的数据后,从站地址加1,就是字节型加上,发现STEP-7-MicroWIN没有字节整数型运算指令,无意中发现字节递增指令INC_B,这样就可实现每次地址加1。程序修改后大小为9400左右。
下载后进行通信,使用的速率为115200,无法通信,又是什么原因?用计算机串口在RS485中继器网络2上检测不到数据,网络1连接的PLC,网络1上有数据。一共两个中继器,互换一下看看吧,还是不好用。说一个这两个中继器,一个是朋友的工程余货,一个是在淘宝上淘的二手(这里可以鄙视我一下)。两个中继器的接线,开关位置都没问题,就是通信不上,原因还是待查。大胆的将CPU通信直接连入网络2,发现PLC指令还是显示从站无响应,因为此时速率还是115200,全部改成9600试试吧,改成后全部都可以读取啦。非常高兴的说。现在速率运行在38400的速度上,轮询23台变频的总时间在8秒左右,只监不控可以了。
话说这样就结束了吗,还没有。可以看上面变频出来的数据不适合上位机监视,所以要经过数据转换。我程序的形式是每次读取一台变频器的数据传出,再进行整体的数据转换,发现每次从地址23再地址1时全部变频的数据会向后串一台变频器,就是地址1的数据是地址23的,只是一个周期。心里这应该是程序中有些指令是多周期的导致数据还没转换完就读取下一台的数据了。接着改程序,改成每次读取的数据传出,再用sm0.0启用数据转换。不再有上述现象。
还没结束,发现转换后变频器的频率不正确,而从转换前的数据是正确的。可以看变频器的频率数据是Uint16,要变成浮点数才可以。原程序是将Uint16格式的VW传出到VW,发现传出后的VW里的数值就和前面的不一样的,这个真的不知道为什么了,还请高手解答一下。如何解决的呢,我不再把数值传出,传送指令前要加根据从站地址接通的上升沿,我直接将Uint16格式转换成双整数DI,再转换成浮点数,再用浮点数乘以0.1,*后成功得到频率。
*后对整个程序进行整理,大功告成。