现在和西门子plc通讯感觉主要还是用OPC,
但是我不太喜欢OPC,
虽然它封装了上位和plc的沟通方式,做项目开发比较方便;但毕竟隔了一层;OPC内部同步数据点一次一般也需要500毫秒;
对于高速分拣等需要快速响应的,我想还是直接上下位沟通,绕过OPC;
我看了 西门子有 BCNetS7 协议规范 ,还没细研究;不知道有没有志同道合者一起研究;
而且网上介绍的资料也不多
不过用三菱的PLC却详细的介绍了和上位通讯的内部协议: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;
感觉和上位通讯这块,虽然西门子方式很多,但都偏向于用封装好的东西,比如prodave.dll ,还有及时最广泛的OPC;
不过,我感觉还是绿色的,最直接不借助任何第三方的东西最好; 直接上下位按照标准协议通过socket沟通;
一般在三菱Q系列的plc里,通讯端口设置8000,而且可以开多个通讯端口; 做多个sokcet服务端的监听;
西门子这方便我想应该更强吧。