发表于:2008/10/27 15:41:00
#0楼
在与英威腾(invt)变频器modbus通讯时,采用自己编制主站通讯程序,参照西门子uss程序格式做成库程序,在多个项目上应用,效果还是不错。
s7-200自由口通讯确实很自由,可以编制任何通讯。
西门子自带的modbus主站程序,用在变频器控制上,不方便。要求是能向uss库程序一样有多个控制的位信号输入,在速度设定值变化是发送速度值,平时要读变频器的运行状态(包括故障状态),还想读变频器运行时的电流。于是,自己根据英威腾变频器的通讯协议,编制了modbus主站通讯程序。
modbus通讯协议要求:
读写都是8个字节,只是功能码的不同和读是读得长度,写是写的数据值
发送
vb1600
vb1601
vb1602
vb1603
vb1604
vb1605
vb1606
vb1607
vb1608
8个字节
发送长度8
从站地址
功能码
数据地址高字节
数据地址低字节
数据字长高字节
数据字长低字节
crc校验低字节
crc校验高字节
从上面的通讯结构可以看出:数据地址、字长和crc都是一个字,其中地址和长度或数据高低字节与西门子定义一致,即低地址高字节。crc不一样,是低地址低字节,与计算机上的定义一致。这点必需注意。
变频器写返回:
接受
vb1609
vb1610
vb1611
vb1612
vb1613
vb1614
vb1615
vb1616
vb1617
8个字节
接受长度8
从站地址
功能码
数据地址高字节
数据地址低字节
数据值 高字节
数据值 低字节
crc校验低字节
crc校验高字节
返回与发送时一样,表示通讯数据接受成功,并已执行。
我只需读5个字的参数或1个字的状态,变频器读返回:
接受
vb1609
vb1610
vb1611
vb1612
vw1613
……
vw1621
vb1623
vb1624
n个字节
接受长度n
从站地址
功能码
数据字节字节数
数据1 数值
。。。。。
数据5 数值
crc校验低字节
crc校验高字节
读状态返回7个字节,读5个字返回15个字节。
程序要求:定义通讯优先级别是先写,后读。写命令(运行,停止,复位等)发送级别最高,其次是写频率设定。写通讯发送后,判断返回值,确定是否写成功,若写成功则不再写,只要控制状态或频率改变时,再次写。读为一次读变频器状态,一次读当前运行参数,轮流读取。
根据上述要求,确定了以下几个子程序和中断程序:
1. 初始化子程序:对自由口通讯配置波特率、偶校验等
2. 变频器控制子程序:输入运行、停止、复位、地址、频率设定等入口。输出变频器状态、通讯故障码、当前运行频率、电流等。程序中要根据上次通讯结果判断当前应写还是读。并发出xmt通讯指令,开通发送完成中断。
3. crc校验子程序:运算发送的crc码。
4. 发送完成中断程序:根据发送的内容,确定接受的长度,关闭接受中断,开通接受完成中断。
5. 接受完成中断程序:判断接受信号是否正常,若不正常送出相应的故障码。将接收到的正确信号,送入对应暂存区内,供控制子程序输出。关闭接受中断。
有关程序,我想整理一下,尽快的上传,以供参考
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=65553&Name=ersacn
s7-200自由口通讯确实很自由,可以编制任何通讯。
西门子自带的modbus主站程序,用在变频器控制上,不方便。要求是能向uss库程序一样有多个控制的位信号输入,在速度设定值变化是发送速度值,平时要读变频器的运行状态(包括故障状态),还想读变频器运行时的电流。于是,自己根据英威腾变频器的通讯协议,编制了modbus主站通讯程序。
modbus通讯协议要求:
读写都是8个字节,只是功能码的不同和读是读得长度,写是写的数据值
发送
vb1600
vb1601
vb1602
vb1603
vb1604
vb1605
vb1606
vb1607
vb1608
8个字节
发送长度8
从站地址
功能码
数据地址高字节
数据地址低字节
数据字长高字节
数据字长低字节
crc校验低字节
crc校验高字节
从上面的通讯结构可以看出:数据地址、字长和crc都是一个字,其中地址和长度或数据高低字节与西门子定义一致,即低地址高字节。crc不一样,是低地址低字节,与计算机上的定义一致。这点必需注意。
变频器写返回:
接受
vb1609
vb1610
vb1611
vb1612
vb1613
vb1614
vb1615
vb1616
vb1617
8个字节
接受长度8
从站地址
功能码
数据地址高字节
数据地址低字节
数据值 高字节
数据值 低字节
crc校验低字节
crc校验高字节
返回与发送时一样,表示通讯数据接受成功,并已执行。
我只需读5个字的参数或1个字的状态,变频器读返回:
接受
vb1609
vb1610
vb1611
vb1612
vw1613
……
vw1621
vb1623
vb1624
n个字节
接受长度n
从站地址
功能码
数据字节字节数
数据1 数值
。。。。。
数据5 数值
crc校验低字节
crc校验高字节
读状态返回7个字节,读5个字返回15个字节。
程序要求:定义通讯优先级别是先写,后读。写命令(运行,停止,复位等)发送级别最高,其次是写频率设定。写通讯发送后,判断返回值,确定是否写成功,若写成功则不再写,只要控制状态或频率改变时,再次写。读为一次读变频器状态,一次读当前运行参数,轮流读取。
根据上述要求,确定了以下几个子程序和中断程序:
1. 初始化子程序:对自由口通讯配置波特率、偶校验等
2. 变频器控制子程序:输入运行、停止、复位、地址、频率设定等入口。输出变频器状态、通讯故障码、当前运行频率、电流等。程序中要根据上次通讯结果判断当前应写还是读。并发出xmt通讯指令,开通发送完成中断。
3. crc校验子程序:运算发送的crc码。
4. 发送完成中断程序:根据发送的内容,确定接受的长度,关闭接受中断,开通接受完成中断。
5. 接受完成中断程序:判断接受信号是否正常,若不正常送出相应的故障码。将接收到的正确信号,送入对应暂存区内,供控制子程序输出。关闭接受中断。
有关程序,我想整理一下,尽快的上传,以供参考
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=65553&Name=ersacn