我用MSCOMM控件和PLC通讯,用PLC的通讯协议,发一条命令它回一条,但必须得等PLC回复后才能发第二条命令。我用timer控件循环地发命令,处理收到的数据。但这样一个timer周期大概要2、3秒,谈不上实时地更新显示数据。以前用触摸屏配套的组态软件编程,如果是显示PLC某个地址的状态,PLC有变化马上能显示出来,一页屏上可以监视显示许多个地址,不知道他们是怎么做到的?
解决方案 »
- 一道Excel的算术题-符合条件同变色,否则不同色.
- VB中怎么用SOAP技术调用.net的webService?........
- 请教一个窗体的设计思路,功能是编辑一条记录,实现保存功能时,要有几个按钮相互搭配呀?
- 关于inet控件的用法
- VB要交作业了!~郁闷~~~
- 在VB中改变生成EXE程序的图标那?
- 我想用VB访问代理服务器端的ACCESS数据库
- 像vb自己的工具栏的窗体怎么做啊!好象它可以随便拖放的?同时也可以成为mdi窗体,也可以在菜单栏下面
- list控件属性设置为check后,可以对list中的记录打钩,表示选中这条记录,如何获取选中记录内容?
- 谁会谁会谁不会谁说简单谁来答……
- 移动控件以后保存 出现的问题!!!
- OpenProcess 打开进程失败,错误代码是2,意思是文件未找到.我想可能是这个程序做了保护,还有其它办法可以读取这个程序的内存吗?
用timer已经可以到毫秒了 lz还是嫌太慢
如果用循环 中间不用doevents系统会假死 用了doevents循环会更慢
对于循环我也有fzx4936的顾虑。我奇怪人家触摸屏的组态软件是怎么做的?
LSS:难道是波特率的关系?我只设到9600,而以前用的触摸屏是115200。
有没有人知道组态软件内部都是怎么做的?
可能会产生莫名其妙的副作用。建议:1. 预先在命令数组填充全部命令,用一个timer每次发一个命令(发送周期取决于PLC协议),
在oncomm事件处接收数据,然后放入“命令-数据”数组。 如果在“命令-数据”数组里加入时间标记,还可以判断响应是否符合要求。2. 用另外一个timer专门处理前面的“命令-数据”数组,如果处理快的话,就等待前面的数据,
可以设置两个变量来协调两个timer。这样就可以做到类似异步多线程的效果,感觉流畅,而且不用doevents。
可能会产生莫名其妙的副作用。建议:1. 预先在命令数组填充全部命令,用一个timer每次发一个命令(发送周期取决于PLC协议),
在oncomm事件处接收数据,然后放入“命令-数据”数组。 如果在“命令-数据”数组里加入时间标记,还可以判断响应是否符合要求。2. 用另外一个timer专门处理前面的“命令-数据”数组,如果处理快的话,就等待前面的数据,
可以设置两个变量来协调两个timer。这样就可以做到类似异步多线程的效果,感觉流畅,而且不用doevents。
@00FA00000000001018201C00000040B*
@表开头,00表PLC站号,FA表FINS命令,000000000表网络我不通过以太网直接连的,0101表是读命令,82是D区,01C0是448的十六进制,00BIT位,0004读四个字,0B是校验码,*回车是结束码。
结果:
@00FA004000000001010000345736520049000049*
前面是站号,命令头和网络,0101是命令码,0000是回复码,表示完成,3457365200490000是读到的数据,后面是校验和*回车。和协议有什么关系?
是用一根我焊的线直接连接的,串口对串口。
这个方法是蛮省时间的,但timer的interval属性要设置好了。你说的设置两个变量是不是用于timer的interval的值啊?
你使用9600波特率,理论最大传送字节为每秒960字节,大约每字节需1ms,则PLC返回42字节指令的时间至少需42ms,建议你的若轮询指令间隔为100ms,这样每秒可轮询10个地址的指令.如果需要每秒接收更多地址指令,除了提高波特率外,还可修改通信协议约定,将PLC返回指令中不必要的内容取消(如表示网络的部分),也可采用数字数据使用字节数据而非ASCII字符组成)
其次请检查PLC在收到轮询指令,它反应且回复指令的时间需要多少ms.
接收代码中尽可能不使用Doevents语句.
我的意思是:设置公共缓冲数组,使用事件方式接收,timer1只管发命令,timer2只管处理,设置read_index和write_index,write_index增1,oncomm接收数据写入公共数组,然后timer2使read_index增1,从公共数组读出处理,始终使read_index<=write_index。命令timer1的interval可以:
(1)设置为最长的plc响应时间
(2)也可根据每次命令动态修改处理timer2的interval可以固定设置为5~50毫秒。这样的好处:串口异步接收时可以处理上一次结果和界面操作,而且可以做到不用doevents。不过一次oncomm事件后,如果返回很长,串口缓冲不一定就有本次的全部数据,可能被分割到几次事件幸好你的数据好像都以“@”开头而不用太麻烦。
timer控件循环地发命令,处理收到的数据。但这样一个timer周期大概要2、3秒
不会要这么长吧,能否将代码贴出来让我们学习一下?