当前位置: 首页 > ai >正文

8.26网络编程——Modbus TCP

文章目录

  • 一、思维导图
  • 二、在虚拟机写程序实现 poll 端功能,编写客户端实现和 Slave 通信
    • 1> 单线圈数据的设置
    • 2> 单线圈数据的读取
    • 3> 多线圈数据的设置
    • 4> 多寄存器数据的读取
    • 5> 多寄存器数据的设置
    • 6> 单寄存器数据的读取
  • 三、牛客网刷题

一、思维导图

在这里插入图片描述

二、在虚拟机写程序实现 poll 端功能,编写客户端实现和 Slave 通信

1> 单线圈数据的设置

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x09, 0xFF, 0x00};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

2> 单线圈数据的读取

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x00, 0x08, 0x00, 0x01};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

3> 多线圈数据的设置

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x0F, 0x00, 0x01, 0x00, 0x02,0x01,0x0F};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

4> 多寄存器数据的读取

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x01, 0x00, 0x02};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

5> 多寄存器数据的设置

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x10, 0x00, 0x01, 0x00, 0x01,0x02,0x00,0x0F};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

6> 单寄存器数据的读取

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x02};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

三、牛客网刷题

在这里插入图片描述

http://www.xdnf.cn/news/18776.html

相关文章:

  • 【跨国数仓迁移最佳实践7】基于MaxCompute多租的大数据平台架构
  • 发力低空经济领域,移动云为前沿产业加速崛起注入云端动能
  • Tomcat下载历史版本
  • 前沿技术趋势与应用:探索数字世界的下一个十年
  • 【第三章】软件测试缺陷管理:从判断到回归的全流程实践指南​
  • 支持向量机学习
  • 33.ansible 比较重要的配置文件
  • 可口可乐考虑出售Costa咖世家!加上星巴克中国、Peet’s皮爷咖啡,三大国际咖啡品牌“纷纷卖身”!咖啡行业格局彻底改写!
  • MyBatis-Flex是如何避免不同数据库语法差异的?
  • 微服务-23.网关登录校验-自定义GlobalFilter
  • 数据结构青铜到王者第五话---LinkedList与链表(2)
  • 洛谷: CF632D Longest Subsequence-普及+/提高
  • 相机激光安全等级和人眼安全
  • 亚马逊云科技免费套餐新政解析与实战:数据分析与可视化平台
  • 机器学习(二)特征工程
  • 深度剖析初始化vue项目文件结构!!【前端】
  • (MySQL索引事务) 本节目标 索引 事务
  • 机器学习--支持向量机
  • 数据结构(一):算法的时间复杂度和空间复杂度
  • 在使用spring ai进行llm处理的rag的时候,选择milvus还是neo4j呢?
  • 固定资产管理系统核心模块拆解:全流程管理逻辑
  • 30.LSTM-长短时记忆单元
  • 视频号存在争议了...
  • 从零开始的 Docker 之旅
  • 嵌入式系统学习Day23(进程)
  • 今日分享:C++ string 类模拟实现
  • 【Linux系统】线程概念
  • 【51单片机】萌新持续学习中《矩阵 密码锁 点阵屏》
  • 抽象能力的重要性
  • 使用 flutter_tts 的配置项