1.前言
对于工控而言,有时候会需要和单片机进行通信,最近就测试了一下市面上常见的西门子PLC和STM32F103VET6的单片机进行通信。
2.硬件架构
STM32+W5500+ModbusTCP+西门子1200PLC 中间需要交换机来互联网口
首先通信是要基于协议的,对于单片机和PLC而言之间的通信协议可以有很多,串口232,485,ModbusRTU/TCP等等。现在工控都是组网时代了,ModbusTCP作为一款开源的协议资料也很多便于第三方移植。
PLC端现在大多数支持网口,西门子1200,1500系列PLC自带网口,支持Modbus协议,通信起来也方便一些。
单片机端选择需要带网口,我用的是野火指南者开发板,本身自己没有带网口,但是现在以太网模块很多,这里选择W5500的以太网模块来实现组网。W5500可以实现基于硬件的TCP/IP协议,可以避免解析复杂的TCP/IP协议,例程也多方便移植。其实本质就是基于W5500模块的ModbusTCP移植。这部分有很多参考资料,主要参考这篇文章,十分感谢https://blog.csdn.net/jordan20052009/article/details/46967451?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160744407419726891153872%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160744407419726891153872&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-25-46967451.pc_search_result_cache&utm_term=freemodbus%20tcp
3.移植分析
需要理解Modbus协议的相关内容,W5500的使用,PLC端主站的建立。
其实分3大块:
1.Modbus协议源码移植
2.W5500TCP/IP移植
3.PLC端主站代码的编写
熟悉PLC的朋友应该知道,第3点其实不难,而且是在PLC里面写跟单片机其实没有太大关系,实际上在单片机跑通之后,就可以用Modbus scan32一类的工具去测试连接了,只要调试助手能读取成功就证明单片机端代码没有问题。
那就只剩下第1,2点。我是这么做的,先单独完成Modbus RTU的移植,这样可以方便了解Modbus协议的工作原理,再单独完成W5500TCP/IP的协议移植这样可以理解W5500的使用方法,最后再两者结合,就可以实现。不了解的同学可以尝试分步实现。一定要理解Modbus 因为我们就是在W5500的函数基础上添加Modbus内容。TCP/IP实现底层的收发,Modbus再对其进行处理。
4.移植流程
1.W5500可以直接参考官方的例程,下面是main函数

在这里插入代码片int main( void )
{eMBErrorCode    eStatus;                    systick_init(72);                     // 初始化滴答定时器USART1_Config();                      // 初始化USART1:115200@8-N-1 reset_break_gpio_init();              // 复位与中断管脚初始化spi_gpio_init();                      // SPI管脚初始化spiinitailize();                      // SPI配置初始化printf("\r\n 炜世科技--WIZnet W5500官方代理商。全程技术支持,价格优势大!\r\n\r\n");reset_w5500();                        // w5500硬件复位 PHY_check();                          // 网线检测程序set_w5500_mac();                      // 设置w5500MAC地址set_w5500_netinfo();                  // 设置w5500网络参数socket_buf_init(txsize, rxsize);      // 初始化4个Socket的发送接收缓存大小printf("\r\n W5500为TCP Server,建立侦听。等待PC作为TCP Client建立连接。\r\n");printf(" TCP Server IP:%d.%d.%d.%d。\r\n",remote_ip[0],remote_ip[1],remote_ip[2],remote_ip[3]);printf(" TCP Server Port:%d。\r\n",remote_port);printf(" 正常现象:连接成功,TCP Client发送数据给W5500,W5500将返回对应数据。\r\n");eStatus = eMBTCPInit( 2 );           //Modbus相关TCP初始化eStatus =eMBEnable();                //Modbus协议栈使能   while(1){   modbus_tcps();                       //主函数}
}

这其实是官方的例程,Modbus是后添加的,while中的循环函数我也进行了修改,是跟Modbus相关的。其实执行到最后一条Prtinf语句后,W5500就已经配置完成了,已经可以ping通了,这就可以证明W5500运转正常了,之后再去做下一步动作。官方的例程基本不需要修改,拿来直接用就可以,只是SPI部分的硬件接线要根据自己实际板子来修改部分代码。关于W5500可以参考官网的教程和网络资料也比较多,这里不多说。说一下IP地址

/*MAC地址首字节必须为偶数如果多块w5500网络适配板在同一现场工作,请使用不同的MAC地址
*/
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};/*定义默认IP信息*/
uint8 local_ip[4] = {192,168,1,8};                        // 定义w5500默认IP地址
uint8 subnet[4] = {255,255,255,0};                          // 定义w5500默认子网掩码
uint8 gateway[4] = {192,168,1,1};                           // 定义w5500默认网关
uint8 dns_server[4] = {114,114,114,114};                    // 定义w5500默认DNSuint16 local_port = 502;                                   // 定义本地端口

注意单片机IP要和本地PLC在同一网段。端口号要和PLC端一致,常用502.
mac地址如果是多设备注意不要重复。下面是while中的函数。和RTU不同,TCP是一直处在监听状态,一旦建立了连接就会一直查询,检测到数据长度ucTCPRequestLen>0就开始接受数据,接受到数据之后,再驱动empoll函数即可 进入到Modbus的内部处理流程,处理完了再通过send函数发送出去。Send和recv都是W5500的库函数。

void modbus_tcps(void)
{  uint16 len=0;  switch(getSn_SR(SOCK_TCPS))                             // 获取socket的状态{case SOCK_CLOSED:                                     // socket处于关闭状态socket(SOCK_TCPS ,Sn_MR_TCP,local_port,Sn_MR_ND);   // 打开socketbreak;     case SOCK_INIT:                                       // socket已初始化状态listen(SOCK_TCPS);                                  // socket建立监听break;case SOCK_ESTABLISHED:                                // socket处于连接建立状态if(getSn_IR(SOCK_TCPS) & Sn_IR_CON){setSn_IR(SOCK_TCPS, Sn_IR_CON);                   // 清除接收中断标志位}ucTCPRequestLen=getSn_RX_RSR(SOCK_TCPS);                        // 定义len为已接收数据的长度if(ucTCPRequestLen>0){recv(SOCK_TCPS,ucTCPRequestFrame, ucTCPRequestLen); //W5500接收数据xMBPortEventPost(EV_FRAME_RECEIVED);  //发送EV_FRAME_RECEIVED事件,以驱动eMBpoll()函数中的状态机eMBPoll();   //处理EV_FRAME_RECEIVED事件eMBPoll();   //处理EV_EXECUTE事件if(bFrameSent)  {  bFrameSent = FALSE;  //W5500发送Modbus应答数据包                               send(SOCK_TCPS,ucTCPResponseFrame,ucTCPResponseLen);}                                                 }break;case SOCK_CLOSE_WAIT:                                 // socket处于等待关闭状态disconnect(SOCK_TCPS);                              // 断开当前TCP连接close(SOCK_TCPS);                                   // 关闭当前所使用socketbreak;}
}

其实如果完全不了解Modbus协议的话,移植起来还是比较困难,建议一定要了解一些之后再移植,可以先做ModbusRTU的移植。

基于Modbus/TCP的西门子1200PLC和STM32通信相关推荐

  1. 罗克韦尔AB PLC 通过KEPServer实现与西门子1200PLC的以太网通信

    罗克韦尔AB PLC 通过KEPServer实现与西门子1200PLC的以太网通信 环境搭建: 软件:  Studio 5000 V33.01.01  KEPServerEX 6.4  TIA ...

  2. 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)...

    版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...

  3. Python 基于modbus tcp 协议 实现与plc通信

    仅作为本人学习记录分享:学习是一层窗户纸,没实现之前什么都会觉得困难.前后找了许多教程,c++.java等,最后选择了python来实现,希望本文可以让读者少走弯路. 实现结果:python程序作为c ...

  4. 基于Modbus协议的KingSCADA-IOserver和仿真PLC通信

    1.获取本机和从机IP地址 设本机192.168.1.1 设从机192.168.1.2 cmd命令ping主从机保证网络连通 2.从机运行仿真PLC软件(ModSim32) 寄存器地址(Adderss ...

  5. winpcapp配置c++网口通讯_(经验)西门子PLC的Modbus TCP通讯的一些经验

    Modbus是一种协议公开的工业通讯,被广泛使用.通过串口的是Modbus-RTU协议,通过以太网的是Modbus TCP通讯.现在的PLC都开始支持以太网通讯,因此,Modbus TCP也越来越重要 ...

  6. micropython教程modbus_基于S7-300400 CPU集成PN接口的Modbus TCP在TIA Portal的使用入门教程...

    基于S7-300400 CPU集成PN接口的Modbus TCP在TIA Portal的使用入门. Modbus TCP通讯概述 MODBUS TCP 使MODBUS_RTU协议运行于以太网,MODB ...

  7. 【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信

    接下来的内容,我会以从头开发一个简单的基于modbus tcp通信的案例,来实现一个基础的通信功能. 有关环境: 开发环境:VS 2022企业版 运行环境:Win 10 专业版 .NET 环境版本:. ...

  8. plc tcp ip通讯怎么只能连一个客户端_一款Ethernet/IP和Modbus TCP转OPC UA产品

    . 1   协议简述 Ethernet/IP协议是ODVA组织发布的一个以太网协议,当然了ODVA里最主要的成员是Rockwell等美国公司.ODVA组织除了发布有Ethernet/IP协议,还有常见 ...

  9. 基于Modbus TCP-IP协议的WEINVIEW HMI与PC通讯

    基于Modbus TCP/IP协议的WEINVIEW HMI与PC通讯

  10. 基于STM32和W5500的Modbus TCP通讯

     在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植前的准备工作 为了实现Modbus ...

最新文章

  1. WAS集群系列(2):数据库连接低级错误——网络连接问题
  2. 【转】Android中dp,px,sp概念梳理以及如何做到屏幕适配
  3. UNITY录制视屏解决方案 - ShareREC For Unity3D
  4. wxWidgets:wxBusyCursor类用法
  5. 获取一组radio按钮选中的值Value
  6. 关于直播学习笔记-005-nginx-rtmp-win32在Win10上使用
  7. Redis常用API-使用文档
  8. android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds区别
  9. CAGradientLayer简介 实现颜色渐变
  10. 使用Spring Session实现Spring Boot水平扩展
  11. 【LeetCode】【字符串】题号:*299. 猜数字游戏
  12. java接口自动化测试
  13. 海外苹果ID游戏下载教程
  14. APTHunter——Windows安全日志排查好帮手
  15. 贝塞尔曲线及实践案例
  16. 浅谈大数据的过去、现在和未来
  17. 轻量级配置的登录管理器选择---Silm[zt]
  18. 运用大数据手段 加快传统产业转型升级
  19. 58.union (联合查询)
  20. CF #683 div.2

热门文章

  1. 华硕笔记本触摸鼠标手势无效怎么办
  2. 【Unity编辑器扩展】查找场景和资源内挂载某脚本的所有对象
  3. Arch Linux下 让MPlayer用上CoreAVC1.7.0.0解码器
  4. go-cqhttp + noneBot群聊机器人 配置开发
  5. 用友U8案例教程财务报表
  6. cmd-ssh使用说明
  7. 北森职业测试软件包括的取向,北森人才测评介绍(上).doc
  8. 职业规划报告!草草了事,看看得了
  9. 西门子Step7和TIA软件“交叉引用”的使用
  10. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计v2.5 安卓版-腾牛安卓网...