現(xiàn)在和西門子plc通訊感覺(jué)主要還是用OPC,
但是我不太喜歡OPC,
雖然它封裝了上位和plc的溝通方式,做項(xiàng)目開(kāi)發(fā)比較方便;但畢竟隔了一層;OPC內(nèi)部同步數(shù)據(jù)點(diǎn)一次一般也需要500毫秒;
對(duì)于高速分揀等需要快速響應(yīng)的,我想還是直接上下位溝通,繞過(guò)OPC;
我看了 西門子有 BCNetS7 協(xié)議規(guī)范 ,還沒(méi)細(xì)研究;不知道有沒(méi)有志同道合者一起研究;
而且網(wǎng)上介紹的資料也不多
不過(guò)用三菱的PLC卻詳細(xì)的介紹了和上位通訊的內(nèi)部協(xié)議:MC協(xié)議;
比如讀取D點(diǎn),M點(diǎn),X點(diǎn),Y點(diǎn)的指令是:
//MC協(xié)議讀取通訊點(diǎn)的指令:ENQ_ADDR--讀取首地址 ENQ_LEN--讀取長(zhǎng)度 POINT_TYPE--通訊點(diǎn)類型(D,M,X,Y) ; ArrSend--返回指令數(shù)組
procedure GET_READ_ENQ_BYTES(ENQ_ADDR, ENQ_LEN: Integer;
POINT_TYPE: string; var ArrSend: TArray < Byte > );
begin
SetLength(ArrSend, 21);
//輔助HEAD
ArrSend[0] := $50;
ArrSend[1] := $0;
//QHEAD
ArrSend[2] := $0; //網(wǎng)絡(luò)編號(hào)
ArrSend[3] := $FF; //plc編號(hào)
ArrSend[4] := $FF; //請(qǐng)求目標(biāo)模塊低位
ArrSend[5] := $3; //請(qǐng)求目標(biāo)模塊高位
ArrSend[6] := $0; //請(qǐng)求目標(biāo)模塊站編號(hào)
ArrSend[7] := $C; //請(qǐng)求數(shù)據(jù)長(zhǎng)度低位
ArrSend[8] := $0; //請(qǐng)求數(shù)據(jù)長(zhǎng)度高位
ArrSend[9] := $10; //cpu監(jiān)視定時(shí)器低位
ArrSend[10] := $0; //cpu監(jiān)視定時(shí)器高位
//文字部
//命令
ArrSend[11] := $1;
ArrSend[12] := $4;
//子命令(0000-字讀取 0001-位讀。
ArrSend[13] := $0;
ArrSend[14] := $0;
//開(kāi)始地址
ArrSend[15] := ENQ_ADDR;
ArrSend[16] := ENQ_ADDR shr 8;
ArrSend[17] := ENQ_ADDR shr 16; ;
//設(shè)備編碼:
case POINT_TYPE[1] of
'D':
ArrSend[18] := $A8;
'M':
ArrSend[18] := $90;
'X':
ArrSend[18] := $9C;
'Y':
ArrSend[18] := $9D;
end;
//信號(hào)數(shù)量
ArrSend[19] := ENQ_LEN;
ArrSend[20] := ENQ_LEN shr 8;
end;
感覺(jué)和上位通訊這塊,雖然西門子方式很多,但都偏向于用封裝好的東西,比如prodave.dll ,還有及時(shí)最廣泛的OPC;
不過(guò),我感覺(jué)還是綠色的,最直接不借助任何第三方的東西最好; 直接上下位按照標(biāo)準(zhǔn)協(xié)議通過(guò)socket溝通;
一般在三菱Q系列的plc里,通訊端口設(shè)置8000,而且可以開(kāi)多個(gè)通訊端口; 做多個(gè)sokcet服務(wù)端的監(jiān)聽(tīng);
西門子這方便我想應(yīng)該更強(qiáng)吧。