利用VB进行PC与PCL通信代码Word文档格式.docx

上传人:b****6 文档编号:20604131 上传时间:2023-01-24 格式:DOCX 页数:14 大小:39.97KB
下载 相关 举报
利用VB进行PC与PCL通信代码Word文档格式.docx_第1页
第1页 / 共14页
利用VB进行PC与PCL通信代码Word文档格式.docx_第2页
第2页 / 共14页
利用VB进行PC与PCL通信代码Word文档格式.docx_第3页
第3页 / 共14页
利用VB进行PC与PCL通信代码Word文档格式.docx_第4页
第4页 / 共14页
利用VB进行PC与PCL通信代码Word文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

利用VB进行PC与PCL通信代码Word文档格式.docx

《利用VB进行PC与PCL通信代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用VB进行PC与PCL通信代码Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

利用VB进行PC与PCL通信代码Word文档格式.docx

复位程序是在一次输出后,将通信设置清零的过程,需要通过点击“置位”按钮来使程序响应。

和置位程序一样,复位也同样调用子函数,来进行报文的构建。

●返回

返回程序是通过点击“退出”按钮来进行响应,使得其他所有程序段运行结束,退出主程序。

●周期输入端口状态检测

如之前所述的,为了保证通信端口时时畅通,必须定期自动地让程序进行同行状态检测,而周期输出端口状态检测程序段则可以保证,在其他程序段没有进行检测时仍能对通信状态进行自动检测,提高了可靠度。

其中在进行通信端口数校对时,由于计算机只可识别二进制码,所以还调用了一个将地址转为二进制的子函数。

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开关量输出测试

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1