波特率9600,偶校验,8位数据位,一位停止位。
在新建工程的表单上添加MSCOMM.OCX控件,初始化程序:
Private Sub Form_Load()
MSComm1.CommPort = 1 '选择COM1口
MSComm1.Settings = "9600,e,7,1"
End Sub
系统参数主画面如下图所示:
图二
数据读取子程序:
Public Function GetData(ByVal StartAddress As String, ByVal GetBytes As Integer, ByVal Hex_Bytes As String) As String
MSComm1.InputLen = GetBytes * 2 + 4
MSComm1.Output = STX + CMD_Read + StartAddress + Hex_Bytes + ETX + GetSumChk(CMD_Read + StartAddress + Hex_Bytes + ETX)
‘传送数据组成:起始符+命令+首地址+数据位+结束符+和检验码
GetData = MSComm1.Input
MSComm1.InBufferCount = 0
MSComm1.InputLen = 0
End Function
如需读取数据,通过调用GetData子程序。
参数设置程序可参考读取子程序,只是改变命令而已。
Access97数据库中包含三个表单,包括参数表、记录表、报警记录表。
通过如下子程序是将实际称量值(记录表)更新到数据库:
Private Sub SaveData()
Dim i As Integer
Dim valid As Boolean
On Error Resume Next
valid = True
Data1.Recordset.AddNew
Data1.Recordset.Fields("dtime") = TimeSerial(OnHour, OnMinute, OnSecond)
Data1.Recordset.Fields("systime") = Time ‘系统时间
Data1.Recordset.Fields("get_xl") = LF(1) ‘小料当前称量值
Data1.Recordset.Fields("get_fjs") = LF(2) ‘方解石当前称量值
Data1.Recordset.Fields("get_cs") = LF(3) ‘长石当前称量值
Data1.Recordset.Fields("get_sys") = LF(4) ‘石英砂当前称量值
Data1.Recordset.Fields("get_cj") = LF(5) ‘纯碱当前称量值
On Error Resume Next
Data1.Recordset.Update ‘更新数据库记录
Data1.Recordset.MovePrevious
End Sub
程序中,LF(i)变量对应为图二系统参数表单中实称值。
保存参数子程序只是对数据库操作,程序结构可参考以上子程序。
上位机与PLC通信质量的好坏,对系统的安全可靠运行影响极大,因此,编写程序时,除了在两者之间的通信协议上保持绝对一致和采取相应的容错技术外,还要考虑系统的整体容错技术,防止系统的不正常。
四、结束语
串行通信是目前计算机与其他设备之间通信广泛采用的方式之一,传送数据准确,程序稳定运行是系统开发的主要目的。本设计中充分利用计算机和PLC的资源,在几乎不增加设备开支的情况下成功的实现上位机与PLC之间的通信。