当前位置:首页 > 利用VB进行PC与PCL通信代码
上海理工大学本科生毕业设计(论文)
利用VB进行PC与PLC通信
程序代码与程序运行结果
1 计算机与可编程控制器通信程序说明 1.1 计算机与可编程控制器通信运行界面
在编写程序代码之前应先应用VB6.0建立一个运行界面,如图5.1。
图5.1 PC与可编程控制器状态通信界面
1.2 计算机与可编程控制器通信程序说明
整个PC与可编程控制器通信的程序段中,结合所做界面与构想,分为初始运行、回路测试、置位、复位、返回和周期输入端口状态检测几大部分。 ? 初始运行
在初始运行程序段中,包括了对地址栏中地址、图形控件的初始设置,以及Mscomm控件通信参数的赋值。 ? 回路测试
回路测试的存在主要是,在状态通信前,能较为明显的显示计算机与可编程序逻辑控制器是否连接通畅。其中利用到时钟控件,来进行周期性地通信监测,在置位、复位及时间定期校核中此控件都被将使用到。 ? 置位
置位程序是用于在回路测试成功后,将计算机的设置值输出给可编程控制器的驱动程
1
个人计算机(PC)与可编程控制器通信
序。此程序段最为重要的是通信报文的建立,PC与可编程控制器通信的报文格式为:
STX CMD 数据ETX SUMH SUML 段 其中STX为开始标志,ASCII码:02H;ETX为结束标志,ASCII码:03H;CMD为命令的ASCII码;SUMH,SUML为从CMD到ETX求累加和,溢出不计。由于每字节十六进制数变为两字节ASCII代码,故校验和为SUMH与SUML。
因为报文的每一段节较为复杂冗长,所以需要调用子函数,来提高程序运行的速度。 ? 复位
复位程序是在一次输出后,将通信设置清零的过程,需要通过点击“置位”按钮来使程序响应。和置位程序一样,复位也同样调用子函数,来进行报文的构建。 ? 返回
返回程序是通过点击“退出”按钮来进行响应,使得其他所有程序段运行结束,退出主程序。
? 周期输入端口状态检测
如之前所述的,为了保证通信端口时时畅通,必须定期自动地让程序进行同行状态检测,而周期输出端口状态检测程序段则可以保证,在其他程序段没有进行检测时仍能对通信状态进行自动检测,提高了可靠度。其中在进行通信端口数校对时,由于计算机只可识别二进制码,所以还调用了一个将地址转为二进制的子函数。
2 计算机与可编程控制器通信代码
所使用的程序为:
Dim setadOut As String, DevDatOut As String '程序初始化
Private Sub Form_Load()
'列出可编程控制器端口输入输出全部地址 For g = 0 To 7
ListInAddr.AddItem g ListOutAddr.AddItem g Next g
For h = 10 To 17 ListInAddr.AddItem h ListOutAddr.AddItem h Next h
2
上海理工大学本科生毕业设计(论文)
ListInAddr.ListIndex = 0 ListOutAddr.ListIndex = 0
MSComm1.CommPort = 1 '通信口 MSComm1.Settings = \ '串口参数设置 MSComm1.Handshaking = 0 '握手信号
MSComm1.InputLen = 0 '设置和返回input每次读出的字节数,设为0时读出接收缓冲区中的内容
MSComm1.OutBufferCount = 0 '设置和返回发送缓冲区的字节数,设为0时清空发送缓冲区
MSComm1.InBufferCount = 0 '设置和返回接收缓冲区的字节数,设为0时清空接收缓冲区
MSComm1.PortOpen = True '打开串口
InAlarm.FillColor = QBColor(10) '输入信号指示灯,初始绿色 OutAlarm.FillColor = QBColor(10) '输出信号指示灯,初始绿色 End Sub
'回路测试
Private Sub command3_Click() Dim Tim As Single
MSComm1.InBufferCount = 0 '清空接收缓冲区 MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.Output = Chr(5) 'ENQ为请求标志,ASCII值5,VB中以chr(5)表示;
Tim = Timer '返回一个 Single,代表从午夜开始到现在经过的秒数
Do
If Timer > Tim + 1 Then MsgBox \与可编程控制器没有连接!\Exit Sub '判断InBufferCount=1时是否超时
Loop Until MSComm1.InBufferCount = 1
If Left$(MSComm1.Input, 1) = Chr(6) Then 'ACK为正确标志,ASCII值6,VB中以chr(6)表示;
MsgBox \与可编程控制器通讯正常!\与可编程控制器通讯检测\ Else
MsgBox \与可编程控制器通讯不正常!\与可编程控制器通讯检测\为
3
个人计算机(PC)与可编程控制器通信
警告信号
End If End Sub
'置位:置指定地址端口为ON,即打开指示灯 Private Sub command1_Click() Call diziq ()
If CStr(Val(setadOut)) <> setadOut Then Exit Sub ' CStr()函数是将数据转为string型;val()函数可去除数据中的字母,若数据中包含字母“<>”两边数值将会不同,条件就会成立
MSComm1.OutBufferCount = 0 MSComm1.InBufferCount = 0
DevDatOut = \DevDatOut '”7”表示强制通命令;diziq()函数中会调用DevDatOut()函数求的所需要的数值
FG:
MSComm1.Output = Chr(2) + DevDatOut + SumChk(DevDatOut) '求PC向可编程控制器发出的报文;
格式为:
STX CMD 数据ETX SUMH SUML 段 STX的ASCII码为02H;
Tim = Timer Do
If Timer > Tim + 1 Then: Exit Do '判断InBufferCount=1时是否超时 Loop Until MSComm1.InBufferCount = 1 If MSComm1.Input = Chr(6) Then MSComm1.InBufferCount = 0 Else
If MsgBox(\置位不成功\ If MsgBox(\置位不成功\ End If
OutAlarm.FillColor = QBColor(12) End Sub
'复位:置指定地址端口为OFF,即关闭指示灯
4
共分享92篇相关文档