利 用 VB6.0實 現(xiàn) PC 與三菱PLC的通信_第1頁
利 用 VB6.0實 現(xiàn) PC 與三菱PLC的通信_第2頁
利 用 VB6.0實 現(xiàn) PC 與三菱PLC的通信_第3頁
利 用 VB6.0實 現(xiàn) PC 與三菱PLC的通信_第4頁
利 用 VB6.0實 現(xiàn) PC 與三菱PLC的通信_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論