做了多年上位機系統,主要是和三菱Q系統做通訊
如今正在做一個上位工控控制的產品;
用的MC協議;
這個相對用的已經比較熟練了;
比如讀取D點,M點,X點,Y點的指令是:
//MC協議讀取通訊點的指令:ENQ_ADDR--讀取首地址 ENQ_LEN--讀取長度 POINT_TYPE--通訊點類型(D,M,X,Y) ; ArrSend--返回指令數組
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; //網絡編號
ArrSend[3] := $FF; //plc編號
ArrSend[4] := $FF; //請求目標模塊低位
ArrSend[5] := $3; //請求目標模塊高位
ArrSend[6] := $0; //請求目標模塊站編號
ArrSend[7] := $C; //請求數據長度低位
ArrSend[8] := $0; //請求數據長度高位
ArrSend[9] := $10; //cpu監視定時器低位
ArrSend[10] := $0; //cpu監視定時器高位
//文字部
//命令
ArrSend[11] := $1;
ArrSend[12] := $4;
//子命令(0000-字讀取 0001-位讀取)
ArrSend[13] := $0;
ArrSend[14] := $0;
//開始地址
ArrSend[15] := ENQ_ADDR;
ArrSend[16] := ENQ_ADDR shr 8;
ArrSend[17] := ENQ_ADDR shr 16; ;
//設備編碼:
case POINT_TYPE[1] of
'D':
ArrSend[18] := $A8;
'M':
ArrSend[18] := $90;
'X':
ArrSend[18] := $9C;
'Y':
ArrSend[18] := $9D;
end;
//信號數量
ArrSend[19] := ENQ_LEN;
ArrSend[20] := ENQ_LEN shr 8;
end;
現在和西門子plc通訊主要還是用OPC,但是我不喜歡OPC,
雖然它封裝了上位和plc的溝通方式,做項目開發比較方便;但畢竟隔了一層;OPC內部同步數據點一次一般也需要500毫秒;
對于高速分揀等需要快速響應的,我想還是直接上下位溝通,繞過OPC;
我看了 西門子有 BCNetS7 協議規范 ,還沒細研究;不知道有沒有志同道合者一起研究;