利用VB进行PC与PCL通信代码

更新时间:2024-06-25 22:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

上海理工大学本科生毕业设计(论文)

利用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

上海理工大学本科生毕业设计(论文)

Private Sub command4_Click() Call diziq

If CStr(Val(setadOut)) <> setadOut Then Exit Sub '数字区包括了字母 MSComm1.OutBufferCount = 0 MSComm1.InBufferCount = 0

DevDatOut = \ '“8”表示强制断命令 FG:

MSComm1.Output = Chr(2) + DevDatOut + SumChk(DevDatOut) Tim = Timer Do

If Timer > Tim + 1 Then: Exit Do Loop Until MSComm1.InBufferCount = 1 If MSComm1.Input = Chr(6) Then MSComm1.InBufferCount = 0 Else

If MsgBox(\复位不成功\ If MsgBox(\复位不成功\ End If

OutAlarm.FillColor = QBColor(10) End Sub

'周期检测输入端口状态 Private Sub Timer1_Timer() Call In_for End Sub

Private Sub In_for() Dim awe, awe1, weishu

Dim BN8, BN7, BN6, BN5, BN4, BN3, BN2, BN1 As Integer Dim devadd As String, setin As String, setad As String Dim weishu1 As String, setad1 As String setad = ListInAddr

If CStr(Val(setad)) <> setad Then Exit Sub '数字区包括了字母 If (setad Mod 10) < 4 Then '断定是低四位还是高四位 weishu = 0 Else

5

上海理工大学本科生毕业设计(论文)

SumChk = Right(Hex$(CHK), 2) '数据转换为十六进制,并去末两位 End Function

'关闭串口退出程序

Private Sub command2_Click() Set 可编程控制器Form = Nothing

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End End Sub

Private Sub Form_Unload(Cancel As Integer) Set 可编程控制器Form = Nothing

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End End Sub

3 计算机与可编程控制器通信测试

程序运行最初画面如图5.2:两处状态圆圈图形的颜色为绿色,两处地址均为初设值:0。

图5.2 程序运行最初画面

点击“回路测试”,会出现如图5.3.1话框,则说明PC与可编程控制器通信正常,若出现如图5.3.2的对话框,则说明通信不正常,需调试。

11

个人计算机(PC)与可编程控制器通信

图5.3.1 通信正常 图5.3.2 通信不正常

4 计算机与可编程控制器通信结果 4.1 开关输入量运行结果

通信正常时,在输入地址中选择一地址,以“5”为例。在可编程控制器上接通输入端5,即可发现状态,输入区圆圈图形的颜色变为红色。输出区没有变化。如图5.4。

红色

绿 色

图5.4 开关量输入测试结果

4.2 开关量输出运行结果

通信正常时,在输出地址中选择一地址,以“10”为例,点击“置位”,会发现,可编程控制器“10”输出端灯亮起,输出区状态图形显示为红色,输入区没变化,如图5.5。点击“复位”后,可编程控制器灯灭,输出区地址归零,状态图形显示为绿色,即恢复成图5.2状态。

12

上海理工大学本科生毕业设计(论文)

图5.5 开关量输出测试

13

本文来源:https://www.bwwdw.com/article/b9w3.html

Top