其他串口类似,请注意区分串口号。
三、串口的属性
请参与附件,如果不行,请网上下载相关资料《串口通信-MSComm控件使用详解》,因为是获取条码,故只列举RThreshold属性。
RThreshold属性: 通过该属性设置产生OnComm 事件(接收时产生)的阀值,若MSComm1.RThreshold:=0,不产生OnComm 事件,若MSComm1.RThreshold:=5,接收缓冲区每收到5字节时,则产生OnComm 事件
在实际的使用中,设定RThreshold属性的值为1,即1个字符触发一次OnComm事件,通过判断字符是否接收到末尾字符(案例中,条码的末尾字符是EOT(char(4))。扫描枪识别条码后会自动加上回车符char(13)),把没有检测到末尾字符就接收到数据放在一个WINCC的内部变量中,不断的累加。心想,50个字符应该会进行50次的OnComm事件吧?
四、模拟测试与实际调试
测试的环境如下:WIN7 32位,安装了CommTone6.0串口调试和Configure Virtual Serial PortDriver软件,用于发送数据和虚拟串口。
在模拟测试中发现,50个字符并没有产生50次的OnComm事件,在画面刚开始打开,也就是第一次打开串口,执行了2次,后面继续发送,每发送一次,产生3次时间,其中50个字符都是一次接受完成,其余均为空字符。(至于第一次是2,后面是3次,还是第一次是3,后面2次不记得了,Zui重要的信息是,无论多少个字符都是一次完成)
在虚拟测试中发现,把数据写入内部变量,比如Buffer1.write,在该代码后面出现Buffer1.read,发现仍然为空值,但是如果中间有MSGBOX弹出别的对话框,人工确定,那么后面弹出的Buffer1.read有值,说明Buffer1.write(内部变量的写入)也是有时间要求。(原先以为是整个代码执行完成后再写入,类似于PLC的IO寄存器一样,执行程序时先扫描,执行完成后再更新)。
虽然是一次完成,但我初步认为,虚拟的串口数据在内存或硬盘上,几乎是不用传送时间,所以实际中不见得也是一次接收到这么多字符,我还是按我的设想迎接实际调试。
以下是数据接收代码:
获取手持扫描枪的信息
DimobjMSComm,Buffer1,ProcessLabel,Process_RUN,SGW
Dim strTempTAG,strTemp,t1,t2
Dim mm,nn,jj,kk,tt
Dim pp,qq,BZ
DimMessageCode,MessageType,MessageText,r1,r2,r3,r4,r5
Dim m,n,p,q
Dim xx,zz,OUTMsgText
Set objMsComm =HMIRuntime.Screens("MAIN").ScreenItems("OP30COM1")
Set Buffer1 =HMIRuntime.Tags("OP30_Buffer1")
Set ProcessLabel =HMIRuntime.Tags("OP30_ProcessLabel")
Set Process_RUN = HMIRuntime.Tags("OP30_Process_RUN")
Set SGW =HMIRuntime.Tags("OP30_Status_SGW")
Set BZ =HMIRuntime.Tags("OP30_BarRead_BZ")
Set MessageCode =HMIRuntime.Tags("OP30_MessageCode")
Set MessageType =HMIRuntime.Tags("OP30_MessageType")
Set MessageText =HMIRuntime.Tags("OP30_MessageText")
Set OUTMsgText =HMIRuntime.Tags("OP30_Text")