weixin_44545235 2019-08-01 17:08
浏览 1160

TCP/IP网络通信,自己写的client向modbus slave发送一串数据,modbus slave无法接收

问题如题。先说我的目的:我想让我的client发送{0,0,0,0,0,6,1,6,0,0,0,1}这样一串数据,对应的modbus slave会将第0位置1.
现在不止modbus salve没有动作,communication也抓不到任何信息。
如下贴上client的代码。
使用的是本机的IP地址,port口6530.

#include <iostream>
#include <fstream>
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>

using namespace std;
void main()
{
    int socket_return;
    int socket_length = sizeof(SOCKADDR);
    char my_recvbuf[200];
    char my_sendbuf[12]={0,0,0,0,0,6,1,6,0,0,0,1};

    //创建套接字库
    WORD my_version_word;
    WSADATA my_wsaData;

    my_version_word = MAKEWORD(2,2);

    socket_return = WSAStartup(my_version_word,&my_wsaData);
    if (socket_return != 0)
    {
        return;//成功返回值为0
    }

    if (LOBYTE(my_wsaData.wVersion) != 2 || HIBYTE(my_wsaData.wVersion) != 2)
    {
        WSACleanup();
        return;
    }

    //创建套接字
    SOCKET my_socket = socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN my_socket_address;
    my_socket_address.sin_addr.S_un.S_addr = inet_addr("172.16.66.68");
    my_socket_address.sin_family = AF_INET;
    my_socket_address.sin_port = htons(6530);

    //绑定套接字
    bind(my_socket,(SOCKADDR*)&my_socket_address,socket_length);

    //connect
    if (connect(my_socket,(SOCKADDR*)&my_socket_address,socket_length) == 0)
    cout<<"connect the server correct!"<<endl;
    else
    cout<<"connect the server failed!"<<endl;

    while (1)
    {
        Sleep(1000);
        send(my_socket,(const char*)(char*)my_sendbuf,12,0);
        cout<<"the message has sent correctly!"<<endl;
        /*recv(my_socket,my_recvbuf,sizeof(my_recvbuf)+1,0);
        cout<<my_recvbuf<<endl;*/
        //excetely successed
    }
}

我使用别的网络收听工具时,是可以接收到我这段信息的。
贴图如下:
图片说明

为什么modbus slave收不到这段数据呢?
我怀疑是不是我发送的是char数组,数制不符合modbus的要求?
小弟愚钝,目前还是趟水过河的阶段,请各位大神不吝赐教。万分感谢。

//////////////////////////////////////////////////////////////////
标记一哈,我好像发现了一点问题。
我使用的另一个网口调试助手是network_debug_tool.
我之前发送的12个元素的数组,要么是用的char,要么用的是UINT8,这些都是1bite的,按理说网口的速率应该是12bps,但是network可以接收这些数据,我看了一下server的RXspeed,是24bps。
我是用network模拟client,发送同样的一组数据给modbus slave,发现TXspeed也是24bps。这样的一组数据发给modbus slave,对方就可以响应。
我考虑把我的那一组数组改成UINT16,看看modbus slave是否会响应。

///////////////////////////////////////////////////////////////////
改成UINT16,UINT32,统统都是24bps,感觉和数制的关系不大。改为uint16,network模拟的server接收到这样一串数据,“0,0,0,0,0,0,0,0,0,0,6,0”,而我发送的数据是“0,0,0,0,0,6,1,6,0,0,0,0,1”,应该是我默认发送的元素是12个?,所以把我发送的uint16的数字全拆开发送了?这样看来也不能说和数值关系不大。但是肯定不能用bps那个数来判断了。可惜我找不到监听工具,不知道我到底发出去的信息是什么样的。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 c程序不知道为什么得不到结果
    • ¥40 复杂的限制性的商函数处理
    • ¥15 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置