这两天看了下三菱Q系列的MC协议,网上没找到类似的delphi代码,自己手写一份,以下是发送读指令的代码,贴出来,有用的朋友可以拿去看看,(注:这份是QNA的C24模块的帧3C兼容的第四种格式的协议规范,时间关系,其他的格式没写,有需要的博友到通信手册里找找就有了。)
procedure TForm1.Button3Click(Sender: TObject);
var
p:pchar;
x:integer;
TmpByte:array[0..39] of Byte;
begin
// 以下位FX Q系列QNA的C24类型模块帧兼容3C格式4的协议规范。
TmpByte[0]:=$05; //ENQ ,06为ACK,15为NCK
TmpByte[1]:=$46; //识别帧编号,其中3C位F9,4C位F8
TmpByte[2]:=$39;
TmpByte[3]:=$30; //站编号,即GX Developer 设置的Q 系列C24 的站编号指定对方设备访问哪一个Q系列C24
TmpByte[4]:=$30; //在00 1F 0 31 的范围内变换为2 位数ASCII 代码十六进制数后使用从上位起发送
TmpByte[5]:=$30; //网络编号
TmpByte[6]:=$30; //设置方式,经由编在网络系统中的安装有PLC CPU 的站指定网络编号FE 访问其他站
//时应该用GX Developer 在安装有PLC CPU 的站的PLC CPU 上设置下列参数
//访问其他站时的有效模块的设置在 MNET/10 Eternet 块数设置中设置访问其他站时经由的模块
TmpByte[7]:=$46; //PLC编号 ,参考FX的PIC文件夹中的“PLC编号“,此处因网络号位00,根据表的PLC编号应为FF
TmpByte[8]:=$46;
TmpByte[9]:=$30; //请求目标模块I/O编号 ,当对方设备访问站为控制CPU时,此编号为03FF
TmpByte[10]:=$33;
TmpByte[11]:=$46;
TmpByte[12]:=$46;
TmpByte[13]:=$30; //请求目标模块站编号,多分支连接上的站(00-1F),其他情况位OO
TmpByte[14]:=$30;
TmpByte[15]:=$30; //上位站编号,用ASCII 代码进行数据通讯时使用00 进行发送
TmpByte[16]:=$30;
TmpByte[17]:=$30; //命令, 参考FX的PIC文件夹中的“命令(子命令)”,此处假设位成批位读出,则位0401
TmpByte[18]:=$34;
TmpByte[19]:=$30;
TmpByte[20]:=$31;
//注:以下为格式4的读指令的A部分字符
TmpByte[21]:=$30; //子命令
TmpByte[22]:=$30;
TmpByte[23]:=$30;
TmpByte[24]:=$30;
//读指令内容
TmpByte[25]:=$4D; //软元件代码,此处假设M* ,即4D,2A
TmpByte[26]:=$2A;
TmpByte[27]:=$30; //起始软元件
TmpByte[28]:=$30;
TmpByte[29]:=$30;
TmpByte[30]:=$30;
TmpByte[31]:=$31;
TmpByte[32]:=$30;
TmpByte[33]:=$30; //软元件点数
TmpByte[34]:=$30;
TmpByte[35]:=$30;
TmpByte[36]:=$35;
//注:此处为写数据时加上数据
TmpByte[37]:=$35; //代码和数校验,此处暂未计算,从1加到36 取低两位
TmpByte[38]:=$0D; //CR
TmpByte[39]:=$0A; //LF
Comm1.WriteCommData(p,Length(TmpByte));
end;