发布于 2006-05-01 19:10:13
0楼
我不知道你们说的轮询机制具体是什么样的,呵,但是我用的方法应该是确何安全的:
1、通讯过程由四个中断控制: 发送完成中断、发送超时中断、接收完成中断、接收超时中断。
2、在发送的时候使能发送完成中断和发送超时中断, 若发送超时则再一次发送,连续三次发送超时,则报警,同时切断变频器输入侧电源。
3、在发送完成中断子程序内(说明发送顺利完成),禁止发送超时中断, 同时开始接收指令,使能接收完成中断、使能接收超时中断。
4、若接收超时,则返回到主程序中再一次发送原来的控制字,并接收( 意思是把该通讯指令重来一次,同理,连续三次接收超时,则报警,同时切断变频器输入侧电源。
5、若发送顺利完成,且接收也顺利完成,则在主程序中判断:启始字符是否为16#02?变频器站地址是否相一致?接收到的字符全数是否刚好是一帧的字符数?BCC校验是否正确? 以上任何一项不一致,则也要和第4项一样重新发送,接收一次; 若连续三次以上,则报警,同时切断变频器输入侧电源。
主程序当中做了一个表,只有触发了相应的动作,才会写相应的指令到这个表中,当这个表非空,才会执行通讯程序,否则不执行,这样则节省了主程序的扫描时间。 比如我规定16#02为正转运行,I0.0为外部触发正转命令。 则在主程序中写入
LD I0.0
EU
ATT 16#0302 VW200 //16#03表示变频器站地址为3,16#02表示需要的操作为正转运行。
然后程序在每个扫描周期都是检测VW202=0 ? 若VW202<>0,则说明有通讯指令需要执行,这时用LIFO/FIFO读出VW200表里面的指令,再根据自己规定的动作类型写PZD区,之后进行上面的通讯操作。
I can do it