西门子保定模块代理商
在初始化时要注意自由端口通信协议的设定,一定要使通信过程中的波特率,数据位,奇偶校验及停止位与上位机vb以及通信线上中设定的参数相同,否则将不能实现通信过程,要么接收不到数据,要么会出现“下标越界"的错误。
5上位机的通信部分采用vb语言编程
上位机通信接口部分采用vb语言来编写, 在vb中专门有一个控件microsoft commcontrol(简称mscomm控件)用来提供串行通信。在编程过程中只要设置mscomm控件的属性,就可以实现串行通信。mscomm控件一般不包括在常用的工具框中,需要在右边的工具框的空白处点击鼠标右键,选择components选项,就会出现components对话框,在其中的controls标签下就会找到microsoft comm control6.0,选定它, 点击确定就可以把这一控件加入到右边的工具框中, 图标为。
用鼠标拖动这个图标到bbbb中,即可设置其属性。在此控件众多的属性当中,需要重新定义的属性只有commport(传输数据的通信端口号)、settings(设置数据传输的波特率、奇偶校验、数据位以及停止位,注意,此参数一定要与plc通信程中设置的参数相一致)、portopen(设置通信端口的状态)、bbbbbmode(读取接收缓冲区的格式)等。本工程采用事件驱动方式处理接受信息,即把rthreshold属性设置为非零的值,此时只要接收字符或传输线发生变化就会产生串口事件oncomm。通过查询commevent属性可以捕获这些通信事件。
在vb中实现异或计算的程序及注释如下:
nbyte(1)=ubound(sdata)+1 ’送数据区字节数
fcs=nbyte(1) ’校验码初始化
for i=2 to ubound(sdata)+2
nbyte(i)=sdata(i - 2) ’待发送数据报文数
组的数据区
fcs=fcs xor nbyte(i) ’异或运算, 求校验码
next
nbyte(i)=fcs ’送校验码
其中sdata为发送的数据数组的变量名称,for-next语句实现所发送的数据每一位都进行异或运算。这样就可以把发送数据的异或校验码送到plc中,在plc比较两次计算出的校验码是否相同,从而提高通信的可靠性。
本工程中把计算机向下发送控制命令的部分写成自定义函数send(xi)(i从1到6),在每一个需要发送控制命令的按钮处调用此函数,只是在send中参数设置为不同的控制数。
图1 设备动作状态接收表
图1为模拟一个油机配电屏控制面,该软件可以对三相输出电压、电流、功率因数这些实时信号进行采集、显示并存储,并对设备的动作状态、故障情况采集到数据库中。该控制面上方有一系列的控制按钮,点击某一按钮就会向下位机发送相应的控制命令,控制下位机动作。
在通信过程中,由于计算机为主机,而plc为从机,plc只有在接收到计算机发送的信息后,才发送数据。计算机发送数据的次数并不是与其接收数据次数是一一对应的,计算机每点击一次发送控制命令的按钮(请参看图1)后,plc就要向计算机传输存于其缓冲区内的所有数据,而每引发一次oncomm事件只能传输8个字节,假如plc的发送缓冲区中一共右50个数据,那么每要求向上传送一次数据,就会相应的引发7次oncomm事件,每引发一次oncomm事件程序就会一直执行到endsub为止。这一点可以通过在发送数据的程序中加入测试语句 “debug.print‘start’",在endsub前加一测试语句“debug.print‘end’"来验证,我们可以清楚的在立即窗口中发现每一个start后有7个end。