发布于 2008-09-09 18:42:48
0楼
谢朋友关注回帖!
今天突然想起一件事,当时在本网站下载CP341资料,打包的例程有一个轮询的程序(ptp_485_polling),当时看了,心想以后用时再翻翻。但是做FC16不够顺利把这件事情忘得干干净净。
下午有点时间在这个程序基础上做了实验。
这个程序非常有用。ASCII协议,只有一个FB8和一个FB7,利用计时器安排时序,对FB8的源数据块DB1某WORD不断设置数据后,触发REQ端发码。DB1其实没有什么数据,仅设置了20个WORD的空数组。
我运行了一下,运行后不停发数据,TXD灯有规律闪烁。可以用SSCOM32收到代码。
DB1有20个字的数组,DB1长度=42 BYTE。
例程却设置LEN=10,用SSCOM32观察,也确实发10个数。
修改为LEN=15,用SSCOM32观察,收15个数,
修改为LEN=40,用SSCOM32观察,收40个数
修改为LEN=46,不发数,TXD灯不闪烁。没有错误提示。
修改为LEN=5,用SSCOM32观察,发5个数,
修改为LEN=2,用SSCOM32观察,发2个数,
这使我认识到Z在ASCII协议调用FB8,LEN的设置比较自由。说明LEN 可以比DB1小,不能大。感觉ASCII协议发码速度挺快。
在这个基础上使用MODBUS协议通讯。设计对两个从站1。2分别进行FC03,FC06操作。运行效果,对DB1相关内容的修改在变量表观察都在变化,SSCOM32却只收到对2号从站操作信号:
02 03 00 00 00 06 C5 FB
02 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F DC 7D
02 03 00 00 00 06 C5 FB
02 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F DC 7D
02 03 00 00 00 06 C5 FB
。。。。。。。
把记时器延时从1秒直接修改为3秒。理想的代码看到了(也许不必这么大跨度):
01 03 00 00 00 06 C5 C8
02 03 00 00 00 06 C5 FB
01 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F 98 39
02 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F DC 7D
01 03 00 00 00 06 C5 C8
02 03 00 00 00 06 C5 FB
01 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F 98 39
02 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F DC 7D
使用SLAVE仿真软件,可以看到数字被写入。但是我在DB2没有看到读到的返回代码。这可以再查问题,关键是CP341正确发码了。验证了只用一个FB8,通过修改源数据块内容,可以根据时序控制实行多种任务
按照万版所讲,合理安排好时序,。我想多安排些站也没有问题。但是我感到CP341打包的时间似乎太长了。
在OB1安排两个或者多个FB8原理上应该可以,有空我还想实验。