daizhicun
级别: 探索解密
精华主题: 0
发帖数量: 6 个
工控威望: 137 点
下载积分: 586 分
在线时间: 3(小时)
注册时间: 2013-07-03
最后登录: 2013-08-13
查看daizhicun的 主题 / 回贴
楼主  发表于: 2013-07-03 21:43
做了多年上位机系统,主要是和三菱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 协议规范 ,还没细研究;不知道有没有志同道合者一起研究;
manjialin
专业工业控制软件开发!
级别: 略有小成
精华主题: 0
发帖数量: 144 个
工控威望: 334 点
下载积分: 718 分
在线时间: 110(小时)
注册时间: 2008-11-28
最后登录: 2020-08-26
查看manjialin的 主题 / 回贴
1楼  发表于: 2013-07-04 08:50
以前有搞过,但是不是很稳定,放弃了,使用OPC,有空再温习下看看
daizhicun
级别: 探索解密
精华主题: 0
发帖数量: 6 个
工控威望: 137 点
下载积分: 586 分
在线时间: 3(小时)
注册时间: 2013-07-03
最后登录: 2013-08-13
查看daizhicun的 主题 / 回贴
2楼  发表于: 2013-07-04 23:39
你是程序没有控制好,实际上直接通讯的高效性秒杀opc几条街,可惜的是西门子没有类似的Mc协议