利用VB进行PC与PCL通信代码Word文档格式.docx
《利用VB进行PC与PCL通信代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用VB进行PC与PCL通信代码Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![利用VB进行PC与PCL通信代码Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/23/965c05e5-8b6e-4f57-8811-1d0c646d1dad/965c05e5-8b6e-4f57-8811-1d0c646d1dad1.gif)
复位程序是在一次输出后,将通信设置清零的过程,需要通过点击“置位”按钮来使程序响应。
和置位程序一样,复位也同样调用子函数,来进行报文的构建。
●返回
返回程序是通过点击“退出”按钮来进行响应,使得其他所有程序段运行结束,退出主程序。
●周期输入端口状态检测
如之前所述的,为了保证通信端口时时畅通,必须定期自动地让程序进行同行状态检测,而周期输出端口状态检测程序段则可以保证,在其他程序段没有进行检测时仍能对通信状态进行自动检测,提高了可靠度。
其中在进行通信端口数校对时,由于计算机只可识别二进制码,所以还调用了一个将地址转为二进制的子函数。
2计算机与可编程控制器通信代码
所使用的程序为:
DimsetadOutAsString,DevDatOutAsString
'
程序初始化
PrivateSubForm_Load()
'
列出可编程控制器端口输入输出全部地址
Forg=0To7
ListInAddr.AddItemg
ListOutAddr.AddItemg
Nextg
Forh=10To17
ListInAddr.AddItemh
ListOutAddr.AddItemh
Nexth
ListInAddr.ListIndex=0
ListOutAddr.ListIndex=0
MSComm1.CommPort=1'
通信口
MSComm1.Settings="
9600,E,7,1"
串口参数设置
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)'
输出信号指示灯,初始绿色
EndSub
回路测试
PrivateSubcommand3_Click()
DimTimAsSingle
清空接收缓冲区
清空发送缓冲区
MSComm1.Output=Chr(5)'
ENQ为请求标志,ASCII值5,VB中以chr(5)表示;
Tim=Timer'
返回一个Single,代表从午夜开始到现在经过的秒数
Do
IfTimer>
Tim+1ThenMsgBox"
与可编程控制器没有连接!
"
:
ExitSub'
判断InBufferCount=1时是否超时
LoopUntilMSComm1.InBufferCount=1
IfLeft$(MSComm1.Input,1)=Chr(6)Then'
ACK为正确标志,ASCII值6,VB中以chr(6)表示;
MsgBox"
与可编程控制器通讯正常!
,"
与可编程控制器通讯检测"
Else
与可编程控制器通讯不正常!
48,"
48为警告信号
EndIf
置位:
置指定地址端口为ON,即打开指示灯
PrivateSubcommand1_Click()
Calldiziq()
IfCStr(Val(setadOut))<
>
setadOutThenExitSub'
CStr()函数是将数据转为string型;
val()函数可去除数据中的字母,若数据中包含字母“<
”两边数值将会不同,条件就会成立
MSComm1.OutBufferCount=0
MSComm1.InBufferCount=0
DevDatOut="
7"
+DevDatOut'
”7”表示强制通命令;
diziq()函数中会调用DevDatOut()函数求的所需要的数值
FG:
MSComm1.Output=Chr
(2)+DevDatOut+SumChk(DevDatOut)'
求PC向可编程控制器发出的报文;
格式为:
STX的ASCII码为02H;
Tim=Timer
Do
IfTimer>
Tim+1Then:
ExitDo'
LoopUntilMSComm1.InBufferCount=1
IfMSComm1.Input=Chr(6)Then
Else
IfMsgBox("
置位不成功"
vbRetryCancel+vbCritical)=vbCancelThenExitSub
vbRetryCancel+vbCritical)=vbRetryThenGoToFG
EndIf
OutAlarm.FillColor=QBColor(12)
复位:
置指定地址端口为OFF,即关闭指示灯
PrivateSubcommand4_Click()
Calldiziq
数字区包括了字母
8"
“8”表示强制断命令
MSComm1.Output=Chr
(2)+DevDatOut+SumChk(DevDatOut)
ExitDo
复位不成功"
OutAlarm.FillColor=QBColor(10)
周期检测输入端口状态
PrivateSubTimer1_Timer()
CallIn_for
PrivateSubIn_for()
Dimawe,awe1,weishu
DimBN8,BN7,BN6,BN5,BN4,BN3,BN2,BN1AsInteger
DimdevaddAsString,setinAsString,setadAsString
Dimweishu1AsString,setad1AsString
setad=ListInAddr
IfCStr(Val(setad))<
setadThenExitSub'
If(setadMod10)<
4Then'
断定是低四位还是高四位
weishu=0
weishu=1
awe1=setadMod10'
用ListInAddr的末尾数与输入信号的末尾数进行比较计算
IfOct(Val("
&
o"
+setad))<
setadThen'
判断是不是八进制。
ExitSub
setad1=Val(Str(setad\10))
devadd="
0"
+"
008"
+Hex("
+setad1)+"
02"
+Chr(3)
MSComm1.Output=Chr
(2)+devadd+SumChk(devadd)
LoopUntilMSComm1.InBufferCount=20
setin=MSComm1.Input
weishu1=Val("
H"
+Mid(setin,2,2))
awe=dec2bin(weishu1)
BN8=Mid(awe,1,1)
BN7=Mid(awe,2,1)
BN6=Mid(awe,3,1)
BN5=Mid(awe,4,1)
BN4=Mid(awe,5,1)
BN3=Mid(awe,6,1)
BN2=Mid(awe,7,1)
BN1=Mid(awe,8,1)
SelectCaseawe1
Case0'
awe1断定元件号的位数,如是0位或4位
IfBN1=1Then
biaozi=True
biaozi=False
Case1
IfBN2=1Then
Case2
IfBN3=1Then
Case3
IfBN4=1Then
Case4'
IfBN5=1Then
Case5
IfBN6=1Then
Case6
IfBN7=1Then
Case7
IfBN8=1Then
EndSelect
Ifbiaozi=TrueThen
InAlarm.FillColor=QBColor(12)
InAlarm.FillColor=QBColor(10)
以下dce2bin()函数是将Dats转换成二进制数
PrivateFunctiondec2bin(Dats$)AsString
Dimbin8,bin4,bin2,bin1,bin16,bin32,bin64,bin128
IfDats\128>
=1Then
bin128=1
bin128=0
If(DatsMod128)\64>
bin64=1
bin64=0
If(DatsMod64)\32>
=1Then'
Mod用来对两个数作除法并且只返回余数
bin32=1
bin32=0
If(DatsMod32)\16>
bin16=1
bin16=0
If(DatsMod16)\8>
\运算符用来对两个数作除法并返回一个整数
bin8=1
bin8=0
If(DatsMod8)\4>
bin4=1
bin4=0
If(DatsMod4)\2>
bin2=1
bin2=0
IfDatsMod2=0Then
bin1=0
bin1=1
bin128=CStr(bin128)'
CStr函数将一数值转换为String
bin64=CStr(bin64)
bin32=CStr(bin32)
bin16=CStr(bin16)
bin8=CStr(bin8)'
bin4=CStr(bin4)
bin2=CStr(bin2)
bin1=CStr(bin1)
dec2bin=bin128+bin64+bin32+bin16+bin8+bin4+bin2+bin1
EndFunction
地址计算
PublicSubdiziq()'
将combox中的数据传至输出缓冲区,并判断
DimsetaddrAsString
setadOut=ListOutAddr.Text
IfsetadOut="
Then
MsgBox("
请输入元件地址!
)
+setadOut))<
setadOutThen'
Oct()可将数值转换为八进制
DevDatOut=ydizi(setadOut)
地址范围是0500__057F,方式是1032
PrivateFunctionydizi(Dats$)AsString
DimdevaddAsString
Dimstation1
devadd=Hex("
+setadOut)'
Hex()数据转换为十六进制
station1="
00"
+devadd
devadd=Right(station1,2)'
取末两位
ydizi=devadd+"
05"
PrivateFunctionSumChk(Dats$)AsString
DimI&
DimCHK&
ForI=1ToLen(Dats)'
求数据长度
CHK=CHK+Asc(Mid(Dats,I,1))'
求Dats每一位数据的ASCII码的和
NextI
SumChk=Right(Hex$(CHK),2)'
数据转换为十六进制,并去末两位
关闭串口退出程序
PrivateSubcommand2_Click()
Set可编程控制器Form=Nothing
IfMSComm1.PortOpen=TrueThenMSComm1.PortOpen=False
End
PrivateSubForm_Unload(CancelAsInteger)
3计算机与可编程控制器通信测试
程序运行最初画面如图5.2:
两处状态圆圈图形的颜色为绿色,两处地址均为初设值:
0。
图5.2程序运行最初画面
点击“回路测试”,会出现如图5.3.1话框,则说明PC与可编程控制器通信正常,若出现如图5.3.2的对话框,则说明通信不正常,需调试。
图5.3.1通信正常图5.3.2通信不正常
4计算机与可编程控制器通信结果
4.1开关输入量运行结果
通信正常时,在输入地址中选择一地址,以“5”为例。
在可编程控制器上接通输入端5,即可发现状态,输入区圆圈图形的颜色变为红色。
输出区没有变化。
如图5.4。
绿色
红色
图5.4开关量输入测试结果
4.2开关量输出运行结果
通信正常时,在输出地址中选择一地址,以“10”为例,点击“置位”,会发现,可编程控制器“10”输出端灯亮起,输出区状态图形显示为红色,输入区没变化,如图5.5。
点击“复位”后,可编程控制器灯灭,输出区地址归零,状态图形显示为绿色,即恢复成图5.2状态。
图5.5开关量输出测试