请教台达EH,COM2通讯问题!! 点击:2944 | 回复:12



小可爱

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 25回
  • 年度积分:0
  • 历史总积分:139
  • 注册:2001年6月23日
发表于:2007-06-06 23:59:00
楼主
请教台达工程师和其它台达PLC高手:
1、台达的PLC(具体使用型号为EH-32),串口2是否支持在SLAVE模式下支持RTU通讯模式?
2、如果支持,PLC端和PC端有什么具体注意的事项?我现在在PLC端设置D1120为H87;并置位M1120和M1143,然后PC端发送:01 01 06 14 00 25 5D BD,其中5D BD为CRC校验码,低位在前,高位在后。PLC没有反应。请教各位有应用经验的朋友和台达的工程师,问题出在哪里?我使用ASCII模式可以成功通讯,排除硬件故障的可能 谢谢!



lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2007-06-07 07:53:00
1楼
5D BD为什么高位在前?那样是错误的!直接写成BD 5D试试看

lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2007-06-07 08:13:00
2楼
已经验证过,可以通讯!估计是你的校验码写错了,你用的什么软件?

小可爱

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 25回
  • 年度积分:0
  • 历史总积分:139
  • 注册:2001年6月23日
发表于:2007-06-07 08:41:00
3楼
谢谢lesing.du的回复!

该指令的CRC校验码为BD5D,按照MODICON的MODBUS的说明,应该是低位在前,高位在后,即5D BD,改成BD 5D就是,高位在前,低位在后,我实际测试过BD 5D,也没有响应。请教lesing.du,台达是否有具体RTU通讯设置的相关文档?我看过一个台达的文档,就是"DVP_通讯协议1.0",但是上面主要讲ASCII的通讯模式。
另外,我是使用VC编写的通讯程序,校验码的计算使用的MODICON的例程。

既然台达的MODBUS支持SLAVE的RTU模式,请教lesing.du是否我的PLC端设置有问题?谢谢!!

小可爱

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 25回
  • 年度积分:0
  • 历史总积分:139
  • 注册:2001年6月23日
发表于:2007-06-07 09:47:00
4楼
另外说明一下:这段指令在PC端是以16进制的方式发送出去的,我后来使用串口调试助手来测试,也没有响应!
该指令用来读取T20~T56
地址码为0x01;
功能码为0x01;
按照台达的编址,T0的地址为0x0600,则T20为0x0614;
T56-T20,元件数量为37,HEX为0x25;
计算的校验码为BD5D
故得指令串:01 01 06 14 00 25 5D BD;
PLC无响应,不解!

请高手指点!TKS!

lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2007-06-07 12:53:00
5楼
你的PLC的COM2端设置没有任何问题,因为我就是按照你的设置去验证的!完全可以通讯!关于文档,现在没有整理出来,今天要做月报,晚上可以整理一分给你!

小可爱

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 25回
  • 年度积分:0
  • 历史总积分:139
  • 注册:2001年6月23日
发表于:2007-06-07 16:59:00
6楼
谢谢lesing.du

我先前的测试有问题,现在重新测试,可以通讯,但有一个要注意的地方就是要将CRC校验码的高位放在前面,低位放在后面才可以。我使用的CRC校验码的计算程序为MODCON协议里面的例程,计算出来的结果不需要颠倒就可以了,而不是MODCON的MODBUS协议RTU规范所说的低位在前高位在后。随后将附上源程序,以备后人查阅。

再次感谢lesing.du!
如果有整理好的文档,请发到lh026@163.com,不甚感激!谢谢

小可爱

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 25回
  • 年度积分:0
  • 历史总积分:139
  • 注册:2001年6月23日
发表于:2007-06-07 17:00:00
7楼
计算CRC-16校验码的函数如下:

unsigned short CCOMDlg::CRC16(unsigned char *puchMsg, unsigned short usDataLen)
{
unsigned char auchCRCHi[]= {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;

unsigned char auchCRCLo[]= {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;

unsigned char uchCRCHi = 0xFF ;
unsigned char uchCRCLo = 0xFF ;
unsigned uIndex ; 
while (usDataLen--) 
{
uIndex = uchCRCHi ^ *puchMsg++ ; 
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}

小可爱

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 25回
  • 年度积分:0
  • 历史总积分:139
  • 注册:2001年6月23日
发表于:2007-06-07 17:04:00
8楼
该函数可直接在VC中使用,我现在的使用环境是EVC4.0,无太大区别。
参数说明:
puchMsg为指向需要计算校验码的BYTE型数组的指针;
usDataLen为数组的实际长度,即字节数
返回值即为CRC校验码,直接添加到BYTE型数组后面即为一完整指令串。

lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2007-06-08 09:57:00
9楼
你计算CRC校验码的程序怎么这么多呀?参考变频器的手册,上面有计算CRC校验码的程序,你可以参照以下!

小可爱

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 25回
  • 年度积分:0
  • 历史总积分:139
  • 注册:2001年6月23日
发表于:2007-06-17 00:25:00
10楼
好几天没有上网,谢谢lesing.du的回复!

我没有变频器的手册,不知道台达的CRC校验码的程序是怎么写的。我想应该是另外一种方式吧,就是把我上面的两个表使用程序代码自动生成。这两种方式各有特点,如果查表数据使用代码生成,可以减小文件长度,但需要占用运算时间;如果使用预定义表格,计算时直接调用即可,可提高执行速度。


另外有个问题想请教,就是台达PLC的Command Code:16, Preset Multiple Register,该指令可以写入的寄存器数量是多少,手册上说Number of Register(max)
= 16(for 16 bit register)
= 8(for 8 bit register)
不是很理解。
我现在想写入D419~D434,是否要分批写入?

谢谢!

中达电通

  • 精华:3帖
  • 求助:0帖
  • 帖子:39帖 | 611回
  • 年度积分:0
  • 历史总积分:981
  • 注册:2002年1月06日
发表于:2007-06-18 10:17:00
11楼
呵呵,小可爱的CRC是用查表法做的。变频器的那个是安算法直接写的。2者都可以收藏

新 手

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 48回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2006年5月25日
发表于:2008-10-24 20:03:06
12楼

台达有辅助的计算LRC和CRC的

?


热门招聘
相关主题

官方公众号

智造工程师