Modbus TCP— C++ Builder

self_mark 2011-08-24 10:35:27
麻烦 问一下 谁有modbus tcp 的C++ builder程序?
...全文
669 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
self_mark 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cankoo 的回复:]
modbus 的协议弄懂了就行了。注意了解TCP.
[/Quote]

过程是这样的 我想做个Client端,连接PLC,让PLC的仿真器做Server,现在能连接上,但是,PLC的寄存器值没有改变,好像是没有按照指定协议发送过去,代码是这样写的:
//发送
unsigned char StartLow; //byte类型
unsigned char StartHigh;
unsigned char LengthLow;
unsigned char LengthHigh;
unsigned char WriteStr[18];


StartLow = (StrToInt(Edit3->Text)-1) % 256 ;
StartHigh = (StrToInt(Edit3->Text) - 1) / 256 ;
LengthLow = StrToInt(Edit4->Text) % 256;
LengthHigh =StrToInt(Edit4->Text) / 256;


WriteStr[0] = 0;
WriteStr[1] = 0;
WriteStr[2] = 0;
WriteStr[3] = 0;
WriteStr[4] = 0;
WriteStr[5] = 7 + 2 * StrToInt(Edit4->Text);
WriteStr[6] =0xff;
WriteStr[7] = 16; //写
WriteStr[8] = StartHigh;
WriteStr[9] = StartLow;
WriteStr[10] = 0;
WriteStr[11] = StrToInt(Edit4->Text);
WriteStr[12] = 2 * StrToInt(Edit4->Text);

//数据
WriteStr[13] = StrToInt(Edit5->Text) / 256;
WriteStr[14] = StrToInt(Edit5->Text) % 256;

WriteStr[15] = StrToInt(Edit6->Text) / 256;
WriteStr[16] = StrToInt(Edit6->Text) % 256;

WriteStr[17] = StrToInt(Edit7->Text) / 256;
WriteStr[18] = StrToInt(Edit7->Text) % 256;


String aStr;
for(int j=0;j<=18;j++)
{
aStr = aStr + WriteStr[j];
}
Edit9->Text=aStr;
this->ClientSocket1->Socket->SendText(aStr);

我想可能是发送的报文有问题,不知道如何改正。
cankoo 2011-08-25
  • 打赏
  • 举报
回复
modbus 的协议弄懂了就行了。注意了解TCP.
self_mark 2011-08-25
  • 打赏
  • 举报
回复
谢谢 妖哥 太牛了 程序已经调通了!!
同时也感谢 周药师及cankoo的热情帮助
cankoo 2011-08-25
  • 打赏
  • 举报
回复
注意MODBUS的地址。如果地址是正确的,那么就算是错误的数据也会有反馈。还有,MODBUS有校验码的,校验码错误,无回复!
还要确定你是什么版本的MODBUS,文本与二进制是不一样的。
ccrun.com 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 self_mark 的回复:]
我想可能是发送的报文有问题,不知道如何改正。[/Quote]

毫无疑问,你发送的报文有问题。

你定义了一个byte数组WriteStr(注意你只定义了18个字节的空间,但是赋值有19个),并且初始化赋值了,byte数组中有0x0的成员,在发送时,将byte数组中的数据赋给一个String对象,遇到0x0的时候就截断鸟~~~,所以实际发送的串,是被截断的。

你直接用socket->SendBuf发送一个缓冲,指定长度就行了。将

String aStr;
for(int j=0;j<=18;j++)
{
aStr = aStr + WriteStr[j];
}
Edit9->Text=aStr;
this->ClientSocket1->Socket->SendText(aStr);

换成:
unsigned char WriteStr[19];
...
ClientSocket1->Socket->SendBuf(WriteStr, 19);
周药师 2011-08-25
  • 打赏
  • 举报
回复
很久以前接触过modbus,

无非就是了解协议,然后通过协议给TCP Server 发送命令
然后来接收返回的数据而已,

发送的对错 楼主要仔细对照协议说明,

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧