版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
利用VB6.0實現(xiàn)PC與三菱PLC的通信
哈爾濱李松穎
本文介紹的PC與三菱FX系列PLC通信,是通過PLC的編程口與PC機的串口進行的,采用SC-09編程電纜作為計算機與
PLC通信的連線。電纜的9芯D形插頭連接在計算機串口上,另一端連接PLC的RS-422編程口。
編寫PC的通信程序可采用匯編語言、各種高級語言,也可以采用工控組態(tài)軟件或直接采用PLC廠家的通信軟件。本文采用VB6.0
軟件,它必須依據(jù)所連接PLC的通信規(guī)程來編寫通信協(xié)議,所以先簡單介紹FX系列PLC的通信協(xié)議。
一、FX系列PLC的通訊協(xié)議
1.數(shù)據(jù)傳輸格式
FX系列PLC采用異步格式,由1位起始位、7位數(shù)據(jù)位、I位偶校驗位及I位停止位組成,波特率為9600bps,字符為ASCiII
碼。
2.通信命令
FX系列PLC有4條通信命令,即讀命令、寫命令、強制通命令、強制斷命令。表1中,X為輸入繼電器;Y為輸出繼電器;M
為輔助繼電器;S為狀態(tài)元件;T為定時器;C為計數(shù)器;D為數(shù)據(jù)寄存器。
表1
命令命令碼目標設(shè)箸
讀命令0X、Y、MS、T、C、D
寫命令1X、YMS、T、C、D
強制通命令7X、Y、M、S、TC
強制斷命令8X、Y、M、S、T、C、
3.通信控制字符
FZ系列PLC采用面向字符的傳輸規(guī)程,用到5個通信控制字符,如表2所示。
裊2
ENQ05H請求
ACK06HPLC正確響應(yīng)
NAK15HPLC錯誤響應(yīng)
STX02H報文開始
ETX03H報文結(jié)束
4.報文格式
PC機向PLC發(fā)送的報文格式如表3所示。其中,STX為開始標志;ETS為結(jié)束標志;CMD為命令的ASCII碼:SUMH、
SUML為從CMD到ETX按字節(jié)求累加和,溢出不計。由于每字節(jié)十六進制數(shù)變?yōu)閮勺止?jié)ASCII代碼,故校驗和為SUMH與
SUMIo
|STXlCMDl數(shù)據(jù)段|ETX|SUMH|SUML|
PLC向PC機發(fā)送的應(yīng)答報文格式如表4所示。
裊4
|STX|數(shù)據(jù)段|ETX1SUMH|SUML]
二、PC通信程序的編寫
1?通信口初始化
,MSComm控件簡介:VB帶有專門管理串行通訊的MSComm控件。只需設(shè)置幾個主要參數(shù)就可以實現(xiàn)PLC與PC間的串行
通訊。要完成通信必須設(shè)置MSComm的相關(guān)屬性值,即通信口初始化,其步驟如下:
(1)CoinmPort:設(shè)置或傳回通信連接端口代號。
(2)Settings:設(shè)置初始化參數(shù)。以字-符串的形式設(shè)置或傳回連接速度、奇偶校驗、數(shù)據(jù)位、停止位等4個參數(shù)。
(3)PortOpen:設(shè)置或傳回通信連接端口的狀態(tài)。
(4)lnput:從輸入寄存器傳回并移除字符。
(5)Output:將一個字符串寫入輸出寄存器。
(6)lnputLen:指定由串行端口讀入的字符串長度。
⑺InBufferCount:傳回在接收寄存器中的字符數(shù)。
用VB6.0編寫的程序如下:
PrivateSubForm_LoadO
commli.CommPort=1
commli.Settings="9600,e,7,l”
commli.InputLen=0
commli.InputMode=comlnputMode-
Text
commli.PortOpen=True
Ifcommli.PortOpen=TrueThen
Label1.Caption="打開串口”
EndIf
EndSub
2.通訊程序舉例
首先,在窗體開始設(shè)計之前,添加MSComm控件和按鈕、文本框、標簽等。
(1)PC從PLC中讀取數(shù)據(jù)
假設(shè)PC要從PLC中讀入從D123開始的4個字節(jié)的數(shù)據(jù)(占用兩個數(shù)據(jù)寄存器:D123、D124),其報文如表5所示。
息5
開始命令首地址位數(shù)結(jié)束和校驗
STXCMDGROUPADDRESSBYTESETXSUM
02h30h3Ih.30M6h.36h3011M03h37bM
根據(jù)三菱FX系列PLC編程口通信協(xié)議,地址算法為
address=addressx2+1OOOh
將地址123轉(zhuǎn)換成十六進制為7Bh,因此首地址為:
address=addressx2+1000h=7Bhx2+1000h=10F6h.
再轉(zhuǎn)換成ASCII碼為31h,30h,46h,36h
校驗和SUM=30H+31H+30H+46H+36H+30H+34H+03H=174H,溢出部分不計,故SUMH為7,SUML為“4",相應(yīng)的ASC
H碼為“37H”和“34H
PLC的應(yīng)答報文格式如表6所示。
表6
LAST
STX1STDATE1STDATE......SUM
DATE
用VB6.0編寫的程序如下:
PrivateSubCommand2_Click()
DimOutStringAsString
DimInStringAsString
commli.OutBuflerCount=0
commli.InBuflerCount=0
OutString=Chr(&H2)+“0“+”
10F604"+ChK&H3)+“74”
commli.Output=OutString
Text2.Text="發(fā)送數(shù)據(jù):”+O皿
String
Do
DoEvents
IjoopUntilcommli.InBufferCount
=12
InString=commli.Input
TextZText="返回數(shù)據(jù):"+InString
EndSub
(2)把數(shù)據(jù)寫入PLC
例如,向PLC的D123數(shù)據(jù)寄存器寫入數(shù)據(jù)“1234ABCD”的報文格式如表7所示
A7
其VB6。程序如下:
PrivateSubCommand4_ClickO
DimOutStringAsString
commli.OutBufFerCount=0
commli.InBufFerCount=0
OutString=Chr(&H2)+“1”+”
I0F6041234ABCDM+ChK&H3)+“49”
commli.Output=OutString
EndSub
(3)控制Y1為ON
其報文格式如表8所示。表8
開始命令地址結(jié)束和校驗
STXCMDADDRESSETXSUM
02h37h30h,31h30h,35h03h30h.30h
根據(jù)三菱FX系列PLC編程口內(nèi)
部地址表,Y1的位地址為:0501。
以下是用于強制時的位地址。
4L9
O5(XM)5OFYO-Y17
O5IO-X)51FY20-Y37
052(M)52FY40-Y57
053(M)57FY60-Y177
0530Y60
*
057FY177
其VB6.0程序如下:
PrivateSubConunand7_ClickO
DimOutStringAsString
commli.OutBufTerCount=0
commli.InBufTerCount=0
OutString=Chr(&H2)+T+”
0105w+CM&H3)+“00”
commli.Output=OutString
EndSub
三菱FX系列PLC編程口通信協(xié)議總覽
0三菱FX系列PLC編程口通信協(xié)議總覽
該協(xié)議實際上適用于PLC編程端口以及FX-232AW模塊的通信。
通訊格式:
命令命令碼目標設(shè)備
DEVICEREADCMD"0"X,Y,M,S,T,C,D
DEVICEWRITECMD"1"X,Y,M,S,T,C,D
FORCEONCMD"7"X,Y,M,S,T,C
FORCEOFFCMD"8"X,Y,M,S,T,C
傳輸格式:RS232C
波特率:9600bps
奇偶:even
校驗:累加方式(和校驗)
字符:ASCII
16進制代碼:
ENQ05H請求
ACK06HPLC正確響應(yīng)
NAK15HPLC錯誤響應(yīng)
STX02H報文開始
ETX03H報文結(jié)束
幀格式:
STXCMDDATA……DATAETXSUM(upper)SUM(lower)
例子:
STX,CMD.ADDRESS,BYTES,ETX,SUM
02H,30H,31H,30H,46H,36H,30H,34H,03H,37H,34H
SUM=CMD+……+ETX;
30h+31h+30h+46h+36h+30h+34h+03h=74h;
累加和超過兩位取低兩位
1、DEVICEREAD(讀出軟設(shè)備狀態(tài)值)
計算機向PLC發(fā)送:
始命令首地址位數(shù)終和校驗
STXCMDGROUPADDRESSBYTESETXSUM
例子:從D123開始讀取4個字節(jié)數(shù)據(jù)
02h30h31h,30h,46h,36h30h,34h03h37h,34h
地址算法:address=address*2+10OOh
再轉(zhuǎn)換成ASCII
31h,30h,46h,36h
PLC返回
STX1STDATA2NDDATA.....LASTDATAETXSUM
注:最多可以讀取64個字節(jié)的數(shù)據(jù)
例子:從指定的存儲器單元讀到3584這個數(shù)據(jù)
02h33h35h38h34h03h44h,36h
2、DEVICEWRITE(向PLC軟設(shè)備寫入值)
始命令首地址位數(shù)數(shù)據(jù)終和校驗
SIXCMDGROUPADDRESSBYTES1STDATA2NDDATA……IASTDATAETXSUM
例子:向D123開始的兩個存儲器中寫入1234,AB8
02h31h31h,30h,46h,36h30h,34h33h,34h,31h,32h,33h,34h,41h,42h,43h,44h03h34h,39h
PLC返回
ACK(06H)接受正確
NAK(15H)接受錯誤
3,位設(shè)備強制置位/復位
FORCEON置位
始命令地址終和校驗
SIXCMDADDRESSETXSUM
02h37haddress03hsum
FORCEOFF復位
始命令地址終和校驗
SIXCMDADDRESSETXSUM
02h38haddress03hsum
PLC返回
ACK(06H)接受正確
NAK(15H)接受錯誤
?^-?>|i|J4,WJMt^i'C:Address=Address/8+100h
說明:
1.幀中的BYTES表示需要讀取或者寫入的字節(jié)數(shù)。
2.地址算法上有說明。
3.累加和是從STX后面一個字節(jié)開始累加到ETX的和。
三菱FX系列PLC編程口通信源代碼
fx_comm.h
FX系列PLC四種通信模式的特性
首先講講FX系列PLC的通信方式。
FX系列PLC根據(jù)使用的通信模塊與協(xié)議不同,分為以卜.四種通信模式:
1、PLC的N:N通信方式
2、PLC雙機并聯(lián)通信方式
3、PLC與計算機專有協(xié)議通信方式(無須梯形圖,電腦直接讀寫操縱PLC)
4.PLC與計算機無協(xié)議通信方式(梯形圖RS指令方式,可自定義通信協(xié)議)
以下將詳細列出各通信模式的特性:
N:N網(wǎng)絡(luò)PLC并聯(lián)專用協(xié)議計算機連接無協(xié)議通信
傳輸標準RS485RS485/RS422RS485/RS422或RS232
傳輸距離500mRS485/RS422:500mRS232:15m
連接數(shù)量8站1:11:N(N<=16)1:1
通信方式半雙工FX,FX2c,FXon:半雙工FX2n:全雙工
數(shù)據(jù)長度固定7bit/8bit
校驗無/奇/偶
停止位1bit/2bit
波特率38400bps19200bps300/600/1200/2400/4800/9600/19200
頭字符固定無/有效
尾字符
控制線--
協(xié)議-格式1/格式4無
和校驗固定無/有效
適用機型FX2n,FXonFX2n,FX,FX2cFX2n,FXon,FX,FX2c
FX系列PLC專用協(xié)議通信指令一覽
以卜將詳細列出PLC專用協(xié)議通信的指令:
指令注釋
BR以1點為單位,讀出位元件的狀態(tài)
WR以16點為單位,讀出位元件的狀態(tài),或以1字為單位,讀出字元件的值
BW以1點為單位,寫入位元件的狀態(tài)
WW以16點為單位,寫入位元件的狀態(tài),或以1字為單位,寫入值到字元件
BT以1點為單位,SET/RESET位元件
WT以16點為單位,SET/RESET位元件,或?qū)懭胫档阶衷?/p>
RR控制PLC運行RUN
RS控制PLC停止STOP
PC讀出PLC設(shè)備類型
TT連接測試
注:位元件包括X,Y,M,S以及T,C的線圈等;
字元件包括D,T,C,KnX,KnY,KnM等。
FX系列PLC專用協(xié)議通信指令格式詳解
約定說明:
ENQ為請求標志,ASCII值5,VB中以chr(5)表示;
ACK為正確標志,ASCII值6,VB中以chr(6)表示;
STX為請求標志,ASCII值2,VB中以chr(2)表示;
EXT為請求標志,ASQI值3,VB中以chr(3)表示;
表格中紅色字為需要求和效驗的部分;
和效驗為每項的ASCII值的總和轉(zhuǎn)換成十六進制后M低兩位;
站號、PLC號、元件數(shù)量、和效驗都是以卜六進制表示;
等待延時為0-150毫秒,以十六進制0H-FH表示,如100ms為AH?
1、批量讀出位元件-BR指令
格式:
12345678151617
PC側(cè):BMQ站號PLC號BR延時首地址數(shù)量和效驗ACK站號PLC號
PLOW:STX站號PLC號數(shù)據(jù)EXT和效驗
91011121314
[注]上述中:1、"PLC號"系統(tǒng)默認為"FF;2、"首地址”應(yīng)以卜進制表示,如首地址"X0018”表示從X
寄存器的第18地址單元開始讀取I/O量;3、"數(shù)量"表示讀取的I/O量個數(shù);4、"和效驗"是指從"站號"到"
數(shù)量”之間的各代碼的ASCII碼的累加和;5、PLC側(cè)的響應(yīng)碼中“和效驗"是指從"站號"到"EXT之間的各代
碼的ASCII碼的累加和。6,可以讀出”X"、"Y'和"M”寄存器的內(nèi)容。
例如:要讀出站號為0的Fx2n系列PLC的X00到X08共9點的狀態(tài)值,延時100ms,假設(shè)采用Communi
cationFormat(D8120)的Format1方式::
注釋:請求站號PLC號命令延時元件首地址元件數(shù)量和效驗
代碼:ENQ00FFBRAX00000942
ASCII碼:05H30H30H46H46H42H52H41H58H30H30H30H30H30H35H34H32H
您只要將以匕蘭色部分的代碼以字符串形式(VB中可以表示為CHR(5)&"00FFBRAX00000942")發(fā)送
到PLC,就會有正確的回應(yīng)信息,如下:
注釋:頭站號PLC號元件首地址尾和效驗
代碼:STX00FF001101101EXT05
ASQI碼:02H30H30H46H46H30H30H31H31H30H31H31H30H31H03H30H35H
若發(fā)送碼有誤,則有以卜回應(yīng):
注釋:頭站號PLC號和效驗
代碼:NAK00FF06
ASCII碼:15H30H30H46H46H30H36H
2、批量讀出字元件-WR指令
格式:
12345678151617
PC側(cè):ENQ站號PLC號WR延時首地址數(shù)量和效驗ACK站號PLC號
PLC側(cè):STX站號PLC號數(shù)據(jù)EXT和效驗
91011121314
該命令使用方法與1(BR)命令相同,不再贅述。
3、批量寫入位元件--BW指令
格式:
123456789
PC側(cè):ENQ站號PLC號BW延時首地址數(shù)量寫入值和效驗
PLC側(cè):ACK站號PLC號
101112
4、批量寫入字元件--WW指令(M寄存器100單元置"1")
格式:01FFWWAM01000100010C
123456789
PC側(cè):ENQ站號PLC號WW延時首地址數(shù)量寫入值和效驗
PLCM:05H01FFAM01000100010C
請自行分析以上代碼。
請繼續(xù)關(guān)注如何控制PLC的運行/停止.
利用VB的MSComm控件編程實現(xiàn)PC與三
菱PLCFX系列通信
編寫PC的通信程序可采用匯編語言編寫,或采用各種高級語言編寫,或采用工控組態(tài)
軟件,或直接采用PLC廠家的通信軟件(如三菱的MELSEMEDOC等)
下面利用VB6.0以一個簡單的例子來說明編寫通信程序的要點。假設(shè)PC要求從PLC中
讀入從D123開始的4個字節(jié)的數(shù)據(jù)(D123、D124)
Chr(&H2)+"on"+"10F604"+Chr(&H3)+"74"
命令報文中10F6H為D123的地址,04H表示要讀入4個字節(jié)的數(shù)據(jù)。校驗和SUM=
30H+31H+30H+46H+36H+30H+34H+03H=174H,溢出部分不計,故SUMH=7,
SUAIL=4,相應(yīng)的ASCII碼為“37H”,“34H”。應(yīng)答報文中4個字節(jié)的十六進制數(shù),其
相應(yīng)的ASCH碼為8個字節(jié),故應(yīng)答報文長度為12個字節(jié)。
根據(jù)PC與FX系列PLC的傳輸應(yīng)答過程,利用VB的MSComm控件可以編寫如下通
信程序?qū)崿F(xiàn)PC與FX系列PLC之間的串行通信,以完成數(shù)據(jù)的讀取。MSComm控件可以
采用輪詢或事件驅(qū)動的方法從端口獲取數(shù)據(jù)。在這個例子中使用了輪詢方法。
1)通信口初始化
PrivateSubInitialize()
MSComm1.CommPort=1
MSConun1.Settings="9600,E,7,1”
MSComm1.InBufferSize=1024
MSComml.OutBuffersize=1024
MSComm1.InputLen=0
MSComml.InputMode=comlnputText
MSComml.Handshaking=comNone
MSComml.PortOpen=True
EndSub
2)請求通信與確認
PrivateFunctionMakeHandshaking()AsBoolean
DimInPackageAsString
MSComml.OutBufferCount=0
MSComml.InBufferCount=0
MSComml.OutPut=Chr(&H5)
Do
DoEvents
LoopUntilMSComml.InBufferCount=1
InPackage=MSComml.Input
IfInPackage=Chr(&H6)Then
MakeHandShaking=True
Else
MakeHandshaking=False
EndIf
EndFunction
3)發(fā)送命令報文
PrivateSubSendFrame()
DimOutstringAsString
MSComml.OutBufferCount=0
MSComml.InBufferCount=0
Outstrin=Chr(&H2)+"on"+〃10F604"+Chr(&H3)+"74"
MSComml.Output=Outstring
EndSub
4)讀取應(yīng)答報文
PrivateSubReceiveFrame()
DimInstringAsString
Do
DoEvents
LoopUntilMSComml.InBufferCount=12
InString=MSComml.Inpult
EndSub
1、DEVICEREAD(讀出軟設(shè)備狀態(tài)值)
計算機向PLC發(fā)送:
.位數(shù)和校驗
STX■BYTESETXSUM
例子:從D123開始讀取4個字節(jié)數(shù)據(jù)
H30h,34h03h37h,34h
地址算法:address=address*2+1OOOh
再轉(zhuǎn)換成ASCII
31h,30h,46h,36h
PLC返回
STX1STDATA2NDDATAHLASTDATAETXSUM
注:最多可以讀取64個字節(jié)的數(shù)據(jù)
例子:從指定的存儲器單元讀到3584這個數(shù)據(jù)
02h33h35h38h34h03h44h,36h
2、DEVICEWRITE(向PLC軟設(shè)備寫入值)
例子:向D123開始的兩個存儲器中寫入1234,ABCD
30h,34h33h,34hf31h,32h,43h,44h,41hf42h03h34h,39h
PLC返回
ACK(06H)接受正確
NAK(15H)接受錯誤
3、位設(shè)備強制置位/復位
FORCEON置位
FORCEOFF復位
CMD
PLC返回
ACK(06H)接受正確
NAK(15H)接受錯誤
設(shè)備強制中的地址公式:Address=Address*100h+(*)(必須為4位,不足4位前面補0)
注:*號所代表值:
C:14M:8T:6Y:5X:4S:0
如對M2置位,則為地址為:2*256(100H)+8=0520轉(zhuǎn)為十六進制為:0208再換為ASCII就是:303230
38
說明:
1.幀中的BYTES表示需要讀取或者寫入的字節(jié)數(shù)。
2.地址算法上有說明。
3.累加和是從STX后面一個字節(jié)開始累加到ETX的和。
VB讀寫三菱FX系列PLC數(shù)據(jù)示例
通過前面兩篇文章,我們了解了三菱FX系列PLC的編程口通信協(xié)議。為了更方便讀者學習這里提供
一個用VB編寫的示例,其中包含一個通用模塊,如果你需要對此類PLC進行讀寫數(shù)據(jù)區(qū)的操作可以下載
看看。
三菱FX系列PLC的校驗采用的是和校驗,在寫數(shù)據(jù)和讀數(shù)據(jù)時都會有這個和校驗,和校驗用于檢查
數(shù)據(jù)包是否有錯。因此我們必需知道和校驗的算法,才能成功地進行通信。在這里我們提供了一個和校驗
的VB源代碼:
?***************************************************
PrivateFunctionCheck_FCS(mStrAsString)AsString
DimKAsInteger,mTestAsInteger
ForK=1ToLen(mStr)
mTest=mTest+Asc(Mid(mStr,K,1))
Next
Check_FCS=Right(Hex(mTest),2)
EndFunction
t***************************************************
函數(shù)中的mStr參數(shù)為命令、位數(shù)、數(shù)據(jù)、終止符的合集,讀取時不包括數(shù)據(jù)。使用Check_FCS函數(shù)時
將返回和校驗碼。
當向PLC寫數(shù)據(jù)時,數(shù)據(jù)必須為四位的十六進制數(shù),并且低位在前、高位在后。這里提供一個循環(huán)代
碼,將一個數(shù)組里的整數(shù)轉(zhuǎn)換為向PLC寫入數(shù)據(jù)的字符串:
ForQ=0ToUBound(mData)
myHex=myHex&Format(Hex(mData(Q)Mod&HFF),"00")&Format(Hex(mData(Q)\&HFF),,'00")
Next
在上面的代碼中mData為向PLC寫入數(shù)據(jù)的數(shù)組,myHex最終得到的就是寫入PLC時所要的數(shù)據(jù)
字符串。同樣的從PLC讀出來的數(shù)據(jù)也是四位的卜六進制,低位在前、高位在后。所以我們有必要將其轉(zhuǎn)
換為對應(yīng)的整數(shù)。其主要的轉(zhuǎn)換代碼如下:
ReDimmData(mCounts-1)
ForQ=0TomCounts-1
mData(Q)="&H"&(Mid(myHex,4+Q*4,2)&Mid(myHex,2+Q*4,2))
Next
mCounts為要讀取數(shù)據(jù)區(qū)的個數(shù),myHex是串口返回來的數(shù)據(jù),經(jīng)過上面計算返回的整數(shù)值將排列在
mData數(shù)組里。
引言
在工'業(yè)生產(chǎn)中,人們常常面臨著數(shù)據(jù)采集與管理。作為工廠自動化的三大支柱可編程控制器
PLC(ProgrammableLogicController),由于其安全可靠,廣泛的用于數(shù)據(jù)采集與控制。
生產(chǎn)過程中,要監(jiān)視PLC內(nèi)部的數(shù)據(jù)與運行狀況,選用市場上的人機界面或組態(tài)軟件,雖
然功能豐富,但大都價格昂貴,在一些中小規(guī)模的生產(chǎn)場合,人們希望能自己用高級語言開
發(fā)一個簡易實用的通信程序。使用VisualBasic6.0,開發(fā)串行通信程序時,有兩種方法,
一種是用WindowsAPI函數(shù),另一種是用VB支持的通信控件MSCOMMo以下介紹使用
通信控件方式實現(xiàn)通訊
1.硬件
采用SC-09編程電纜,連接PC串口與PLC編程口實現(xiàn)通訊。
2.PLC編程口的通信協(xié)議簡介
命令~跖令字。控制元件2備注"
讀元件202威/位元件狀態(tài)P
寫元件。1P寫字/位元件狀態(tài)O
置鼠。7~XXOSJX"位元件置膜3
復位28P位元件復位e
通信格式:
怛始將2曲令字Q但地址*快據(jù)區(qū)》性束符c忸校驗2.
波特率9600,偶校驗,8位數(shù)據(jù)位,一位停止位。具體請參考有關(guān)資料,以下舉例說明其
通訊格式
1)、DEVICEREAD(讀出軟設(shè)備狀態(tài)值)
計算機向PLC發(fā)送:
始Q命令「首地址小位數(shù)。終。和校驗。
STXPCMD口GROUPADDRESS^1BYTES。ETXQSUMP
2)、DEVICEWRITE(向PLC軟設(shè)備寫入值)。
始。命令■首地址Q位數(shù)。數(shù)據(jù)。終小和校驗,
STX*CMD+GROUPBYTESP1ST2ND|LASTETXlSUMP
3.具體程序說明
MSComm控件簡介用來提供簡單的串行端口通信功能,也可以用來創(chuàng)建功能完備、事件驅(qū)
動的高級通信工具。Mscomm控件提供了一系列標準通信命令的使用界面。使用它可以建
立與串行端口的連接,通過串行端口再連接到其它設(shè)備(如調(diào)制解調(diào)器、PLC),發(fā)出命令,
交換數(shù)據(jù),以及監(jiān)視和響應(yīng)串行連接中發(fā)生的事件和錯誤。
數(shù)據(jù)讀與寫采用函數(shù)input和output
(1)窗口加載程序
PrivateSubForm_Load()
MSComml.CommPort=1'選擇C0M1口
MSComml.Settings=#quot;9600,e,7,1#quot;
Ifmscomml.portopen=falsethenmscomml.portopen=true
EndSub
(2)數(shù)據(jù)讀取子程序:
PublicFunctionGetData(ByVaiStartAddressAsString,ByVaiGetBytesAsInteger,
ByVaiHex_BytesAsString)AsString
MSComml.InputLen=GetBytes*24
MSComml.Output=STXCMD_ReadStartAddressHex_BytesETXGetSumChk
(CMD_ReadStartAddressHex_BytesETX)
'傳送數(shù)據(jù)組成:起始符命令首地址數(shù)據(jù)位結(jié)束符和檢驗碼
GetData=MSComml.Input
MSComml.InBufferCount=0
MSComml.InputLen=0
EndFunction
三菱FX系列PLCVB2005通^命令
Exp:
WritePLC(BWcMd&MM0106H&”010”)
PublicConstWWcMd="00FFWW4n
PLC命令^息位元-高位元嘉入
PublicConstBWcMd="00FFBW4”
*PLC命令言R息位元-低位元嘉入
PublicConstWRcMd—"00FFWR5”
TLC命令言R息位元■高位元^取
PublicConstBRcMd="00FFBR5”'PLC
命令I(lǐng)K息位元-低位元擅取
#Region”PLCCommand"
PublicSubWritePLC(ByValCmdAsString)
Try
Cmd=Ch?)&Cmd&chksum(Cmd)&Chr(13)&Chr(lO)
RS232_PLC.Write(Cmd)
Application.DoEventsf)
System.Threading.Thread.Sleep(20)
Application.DoEvents()
CatchexAsException
MsgBox(ex.ToStringO)
EndTry
EndSub
#EndRegion
#Region"PLCCMD”
Functiondoc_bit32(ByValvalAsDouble)AsString
doc_bit32=
DoWhileval>0
doc_bit32=(valMod2)&doc_bit32
val=val\2
Loop
ReturnRight(nOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH&doc_bit32,32)
EndFunction
Functiondoc_bit8(ByValvalAsLong)AsString
doc_bit8=
DimiAsByte
Fori=0To7
Ifval/(2A(7-i))>=1Then
doc_bit8=doc_bit8&”1"
Else
doc_bit8=doc_bit8&”0”
EndIf
val=valMod2A(7-i)
Nexti
EndFunction
'傅回天弘重子看板用的檢查礁
Functionstring_xor_checksum(ByValstring_xorAsString)AsByte
IfLen(stringxor)=1Then
string_xor_checksum=0
ExitFunction
EndIf
Dimbyte_bit(7)AsBoolean
Dimxor_bit(7)AsBoolean
DimiAsByte
DimjAsByte
Dimtxt_doc_bit8AsString
txt_doc_bit8=doc_bit8(Asc(Mid(string_xor,1,1)))
Forj=0To7
byte_bit(j)=IIf(Mid(txt_doc_bit8,8-j,=True,False)
Nextj
txt_doc_bit8=doc_bit8(Asc(Mid(string_xor,2,1)))
Forj=0To7
xor_bit(j)=IIf(Mid(txt_doc_bit8,8?j,1)=T,True,False)
Nextj
Forj=0To7
xor_bit(j)=IIf(byte_bit(j)Xorxor_bit(j),True,False)
Nextj
IfLen(stringxor)=2Then
Forj=0To7
Ifxor_bit(j)=TrueThenstring_xor_checksum=stringxorchecksum+2八j
Nextj
ExitFunction
EndIf
Fori=0ToLen(stringxor)-3
txt_doc_bit8=doc_bit8(Asc(Mid(string_xor,i+3,1)))
Forj=0To7
byte_bit(j)=IIf(Mid(txt_doc_bit8,8-j,1)="I**,True,False)
Nextj
Forj=0To7
xor_bit(j)=IIf(byte_bit(j)Xorxor_bit(j),True,False)
Nextj
Nexti
Forj=0To7
Ifxor_bit(j)=TrueThenstringxorchecksum=string_xor_checksum+2Aj
Nextj
EndFunction
得回FX系列PLC用的檢查礁
Functionchksum(ByValchksum_textAsString)AsString
DimtextlenAsByte
DimiAsByte
Dimsum_docAsLong
DimsumhexAsString
textlen=Len(chksumtext)
Fori=1Totextlen
sumdoc=Asc(Mid(chksum_text,i,1))+sumdoc
Nexti
sumhex=Hex(sumdoc)
chksum=Right(sum_hex,2)
EndFunction
噌4f016迤位值的字元醇換卷10迤位的數(shù)值
Functionhex_doc(ByValhextextAsString)AsLong
Ifhex_text=Thenhex_text=0
hexdoc=("&h"+hex_text)*1
EndFunction
*4偃I16迤位值的字元,博換卷16bits的字元
Functionhex_bit(ByValhex4_textAsString)AsString
hexbit=
Dimbit_numAsByte
Dimbit_text(15)AsString
Dimmod_docAsLong
moddoc=hex_doc(hex4_text)
Forbit_num=0To15
bit_text(15-bitnum)=IIf(mod_doc/2A(15-bitnum)<1,_
“0”,T)
moddoc=moddocMod2A(15-bitnum)
hexbit=hexbit+bit_text(15-bitnum)
Nextbitnum
EndFunction
,416暹位值的字元樽換卷含十一的10暹位數(shù)值
Functionhex4_docmux(ByValhex4_textmuxAsString)AsLong
Dimhex4_bit_muxAsString
Dimhex4_bitmux_newAsString
DimflagmuxAsBoolean
DimiAsByte
Dimflag_l_numAsByte
hex4_doc_mux=0
hex4_bit_mux=hex_bit(hex4_textmux)
IfMid(hex4_bit_mux,1,1)=H1"Then
flag_mux=True
Fori=0To15
IfMid(hex4_bit_mux,16-i,1)="I,1Then
flag_l_num=16-i
ExitFor
EndIf
Nexti
hex4_bit_mux_new=Mid(hex4_bit_mux,flaglnum,17-flaglnum)
Fori=0Toflag_l_num-2
IfMid(hex4_bit_mux,flag_l_num-1-i,l)=HlnThen
hex4_bitmuxnew="0"&hex4_bit_mux_new
Else
hex4_bit_mux_new="1"&hex4_bit_mux_new
EndIf
Nexti
Else
flag_mux=False
hex4_bit_mux_new=hex4_bitmux
EndIf
Fori=0To15
IfMid(hex4_bit_mux_new,i+1,1)="I"Thenhex4_docmux=hex4_doc_mux
+(2A(15-i))
Nexti
Ifflag_mux=TrueThenhex4_docmux=-1*hex4_doc_mux
EndFunction
316暹位值的字元樽換卷含十?的10暹位數(shù)值
Functionhex8_doc_mux(ByValhex8_textmuxAsString)AsLong
Dimhex8_bit_muxAsString
Dimhex8_bitmuxnewAsString
DimflagmuxAsBoolean
DimiAsByte
Dimflag_l_numAsByte
hex8_doc_mux=0
hex8_bit_mux=hex_bit(Mid(hex8_text_mux,5,4))&hex_bit(Mid(hex8_text_mux,1,
4))
IfMid(hex8_bit_mux,1,l)=nl"Then
flagmux=True
Fori=0To31
IfMid(hex8_bit_mux,32-i,l)="lnThen
flag_l_num=32-i
ExitFor
EndIf
Nexti
hex8_bit_mux_new=Mid(hex8_bit_mux,flag_l_num,33-flag_l_num)
Fori=0Toflaglnum-2
IfMid(hex8_bitmux,flag_l_num-1-i,1)="1"Then
hex8_bit_mux_new="0"&hex8_bitmuxnew
Else
hex8_bit_mux_new="1"&hex8_bit_mux_new
EndIf
Nexti
Else
flag_mux=False
hex8_bit_mux_new=hex8_bit_mux
EndIf
Fori=0To31
IfMid(hex8_bit_mux_new,i+1,1)="1"Thenhex8doemux=hex8_doc_mux
+(2A(31-i))
Nexti
Ifflag_mux=TrueThenhex8_doc_mux=-1*hex8_doc_mux
EndFunction
10暹位的數(shù)值穗^卷4f@16暹位值的字元
Functiondoc_hex(ByValdoc_numAsLong)AsString
doc_hex=n"
Dimhex_wordAsString
Dimhex_lenAsByte
hex_word=Hex(docnum)
hexlen=Len(hexword)
SelectCasehex_len
Case1:dochex="000"+hexword
Case2:dochex="00”+hexword
Case3:dochex="0”+hexword
Case4:dochex=hexword
EndSelect
EndFunction
116bits樽換卷10迤位數(shù)值
Functionbit16_doc(ByValbit16_doc_txtAsString)AsLong
DimiAsByte
bitl6_doc=0
Fori=0To15
bitl6_doc=bit16_doc+(Val(Mid(bitl6_doc_txt,16-i,1)))*2Ai
Nexti
EndFunction
'含+-的10暹位數(shù)值傅換卷4他16暹位值的字元
Functiondoc_hex4_mux(ByValdoc_hex4muxtxtAsLong)AsString
Dimbit!6_txtAsString
DimiAsByte
Dimflag_l_numAsByte
Dimbitl6_txt_newAsString
DimdocnewAsLong
Ifdoc_hex4_mux_txt>=0Then
doc_hex4_mux=doc_hex(doc_hex4_mux_txt)
ExitFunction
EndIf
bitl6_txt=hex_bit(doc_hex(doc_hex4_mux_txt*-1))
Fori=0To15
IfMid(bitl6_txt,16-i,l)=MlnThen
flag_l_num=16-i
ExitFor
EndIf
Nexti
bitl6_txt_new=Mid(bitl6_txt,flag_l_num,17-flag_l_num)
Fori=0Toflag_l_num-2
IfMid(bitl6_txt,flag_l_num-1-i,1)=M1HThen
bitl6_txt_new="0"&bitl6_txt_new
Else
bitl6_txt_new="1"&bitl6_txt_new
EndIf
Nexti
docnew=bitl6_doc(bitl6_txt_new)
doc_hex4_mux=dochex(docnew)
EndFunction
,含+-的10迤位數(shù)值樽換卷816暹位值的字元
Functiondoc_hex8_mux(ByValdoc_hex8muxtxtAsDouble)AsString
doc_hex8_mux=
Ifdoc_hex8_mux_txt>=0Anddoc_hex8_mux_txt<=65535Then
Dimdoc_hex8_mux_txt_longAsLong
doc_hex8_mux_txt_long=doc_hex8_mux_txt
doc_hex8_mux=doc_hex4_mux(doc_hex8_mux_txt_long)&"0000”
ExitFunction
EndIf
DimflagmuxAsBoolean
DimiAsByte
Ifdoc_hex8_mux_txt<0Then
flagmux=True
doc_hex8_mux_txt=doc_hex8_mux_txt*-1
Else
flag_mux=False
EndIf
Dimbit32_text(31)AsString
Dimdoc_bit32AsString="H
Dimdoc_bit32_newAsString
Dimflag_l_numAsByte
Fori=0To31
Ifi=0Then
Ifdoc_hex8_mux_txt>2147483647Then
bit32_text(31)=,,ln
doc_hex8muxtxt=doc_hex8_mux_txt-2147483647-1
Else
bit32jext(31)=n0n
EndIf
Else
bit32_text(31-i)=IIf{doc_hex8_mux_txt/2A(31-i)<1,_
“0”,T)
doc_hex8_mux_txt=doc_hex8_mux_txtMod2A(31-i)
EndIf
doc_bit32=doc_bit32+bit32_t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)營銷策劃合同
- 網(wǎng)絡(luò)直播平臺用戶畫像分析合同
- 環(huán)保行業(yè)工業(yè)廢水處理技術(shù)創(chuàng)新方案
- 智能教育硬件產(chǎn)品開發(fā)合同
- 智慧能源管理系統(tǒng)研發(fā)合同
- 學校圖書館智能化管理系統(tǒng)建設(shè)合同
- 2024年塔吊設(shè)備租賃協(xié)議模板
- 2024年三方銷售協(xié)議模板
- 2024年采購原材料協(xié)議模板
- R-SCH-546738-生命科學試劑-MCE
- 空氣栓塞培訓課件
- 數(shù)據(jù)治理與數(shù)據(jù)中臺建設(shè)方案
- HG∕T 5248-2017 風力發(fā)電機組葉片用環(huán)氧結(jié)構(gòu)膠粘劑
- 醫(yī)院感染監(jiān)測標準考試試題附有答案
- 高血壓病三級預防策略 醫(yī)學類模板 醫(yī)學課件
- DL∕T 523-2017 化學清洗緩蝕劑應(yīng)用性能評價指標及試驗方法
- 食品營養(yǎng)學選擇試題庫(附參考答案)
- 北師大版二年級數(shù)學上冊第五單元《2~5的乘法口訣》(大單元教學設(shè)計)
- 2024年入團知識考試題庫及答案
- 腫瘤化療導致的中性粒細胞減少診治中國專家共識(2023版)解讀
- 《新能源汽車概論》課件-6新能源汽車空調(diào)系統(tǒng)結(jié)構(gòu)及工作原理
評論
0/150
提交評論