quote:以下是引用LaoHuai在2010-05-25 23:12:30的发言:其实很简单,假如2个从站,一个偶校验,一个无校验。
LD SM0.1
MOVB 9, SMB30 //9600BPS,无校验,每个字符8位数据
MOVB 16#9C, SMB87 //允许接收信息,使用SMB90值检察空闲状态,定时器是信息定时器 , 超过SMW92值停止接收
MOVW +80, SMW92 //根据报文长短,波特率及从站响应的快慢设定,这个时间要小于接收中断(INT3)里定时中断的时间。
MOVW +0, SMW90
MOVB 200, SMB94 //SMW94 最大接收字符数,这里无用,但必须要设置。
ENI
LD SM0.1
ATCH RCV1:INT1, 9 //传输完成中断
MOVB 150, SMB34
ATCH XMT1:INT0, 10 //定时中断
XMT1:
LD SM0.0
DTCH 10
XMT VB100, 0
RCV1:
LD SM0.0
RCV VB200, 0
MOVB 250, SMB34
ATCH XMT2:INT2, 10
MOVB 73, SMB30 //9600BPS,偶校验,每个字符8位数据
XMT2:
LD SM0.0
ATCH RCV2:INT3, 9
DTCH 10
XMT VB300, 0
RCV2:
LD SM0.0
RCV VB400, 0
MOVB 250, SMB34
ATCH XMT1:INT0, 10
MOVB 9, SMB30 //9600BPS,无校验,每个字符8位数据
1 如果从站比较多,就不用太多中断,2个就够了,做2个指针,发送一个指针,接收一个指针。这样做的好处在于,从站再多,程序大小不变。
2 不论对单个变频器写,还是广播方式,写和读的过程是一样的。如果需要闭环控制,控制程序放在主程序里。
3 将SMW92和SMB34的值减小到一个合适的值,可以使通讯效率达到最佳。
4 用
modbus库做至少需要2000字节程序,这样做大大节省程序空间。
谢谢LaoHuai老师的大力帮助和无私奉献,程序我收藏了,得好好学习一下,因为都是
modbus协议,是否还得要crc校验子程序,那个校验程序倒是下过,如果时间紧的话,变频器只能走模拟量了。