当前位置:首页 > 工业控制 > 工业控制
[导读]在产线设备中,PLC常作为主控单元负责工艺流程,FPGA作为高速算法加速/多路采集前端。两者之间通过Modbus RTU(RS485)或 Modbus TCP(以太网)互通,是成本与开发难度最平衡的协同方案。本文以西门子S7‑1200 PLC + Xilinx Artix‑7 FPGA(UART+FreeModbus)为例,讲清完整实现链路。



在产线设备中,PLC常作为主控单元负责工艺流程,FPGA作为高速算法加速/多路采集前端。两者之间通过Modbus RTU(RS485)或 Modbus TCP(以太网)互通,是成本与开发难度最平衡的协同方案。本文以西门子S7‑1200 PLC + Xilinx Artix‑7 FPGA(UART+FreeModbus)为例,讲清完整实现链路。


一、系统架构与协议选型



[S7‑1200 PLC]

  │ Modbus RTU @ 115200,8,N,1  (RS485端口 CM1241)

  ▼

[Artix‑7 FPGA]

  ├─ UART → FreeModbus Slave (保持寄存器映射)

  └─ 用户逻辑:滤波/位置闭环/高速计数



• Modbus RTU:适合中低速、点对点或总线型多从站(≤32节点),接线简单


• Modbus TCP:若FPGA带以太网PHY(如Zynq PS侧),可改用TCP,PLC侧用MB_CLIENT功能块


- 寄存器规划:Holding Registers (0x03/0x10) 用于PLC←→FPGA参数/状态交换


二、FPGA侧:FreeModbusSlave移植与寄存器映射


1. 硬件连接


• FPGA UART通过 MAX3485 转 RS485,A/B 接PLC CM1241 的 A/B


• 120Ω终端电阻在总线两端(PLC侧与最远FPGA侧)


2. FreeModbus移植要点(portserial.c / porttimer.c)


// portserial.c 关键回调

void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )

{

   if( xRxEnable ) HAL_UART_Receive_IT(&huart1,&rx_byte,1);

   if( xTxEnable ) RS485_DE_H(); else RS485_DE_L();

}



3. 保持寄存器回调(用户需实现)


// 假设 usRegHoldingBuf[100] 为FPGA内部映射数组

eMBErrorCode eMBRegHoldingCB( UCHAR *pucRegBuffer,

                              USHORT usAddress, USHORT usNRegs,

                              eMBRegisterMode eMode )

{

   int idx = usAddress - 1;   // Modbus地址从1开始

   if( idx<0 || idx+usNRegs>100 ) return MB_ENOREG;


   if( eMode == MB_REG_READ )

       for(int i=0;i<usNRegs;i++)

           xMBSetWord( pucRegBuffer+i*2, usRegHoldingBuf[idx+i] );

   else // MB_REG_WRITE

       for(int i=0;i<usNRegs;i++)

           usRegHoldingBuf[idx+i] = xMBGetWord( pucRegBuffer+i*2 );


   return MB_ENOERR;

}



映射示例:

• HR[0] – 控制字(bit0=启动滤波 bit1=清错误)


• HR[1..2] – 目标位置(32位,分高低字)


• HR[10] – 实际位置反馈


• HR[20] – 错误码


三、PLC侧:S7‑1200 Modbus Master配置


1. 硬件与指令


• 插入 CM 1241 RS485 模块,设端口参数 115200, 8, N, 1


- 调用库 Modbus_Master(MB_CLIENT 用于TCP)功能块


2. 功能块示例(写控制字+目标位置)


"MB_Master_DB"(REQ    := xStartWrite,

               MB_ADDR:= 1,          // FPGA从站地址

               MODE   := 0,          // 0=写多个保持寄存器

               DATA_ADDR := 40001,   // Holding Register 0 (PLC地址表示法)

               DATA_LEN  := 3,       // 控制字 + 位置低 + 位置高

               DATA_PTR := P#DB10.DBX0.0 WORD 3,

               DONE    => xDone,

               ERROR   => xErr,

               STATUS  => wStatus);



对应读取反馈:

"MB_Master_DB"(REQ:=xStartRead,

               MB_ADDR:=1,

               MODE:=1,              // 1=读保持寄存器

               DATA_ADDR:=40011,    // HR[10]

               DATA_LEN:=2,

               DATA_PTR:=P#DB10.DBX6.0 WORD 2,

               ...);



3. 轮询与超时


建议主循环中以 200ms周期轮询读反馈,写指令仅在参数变更或启动命令时触发,避免总线冲突。


四、调试与故障排查


现象 排查点


PLC报 80C8 (slave not responding) 检查A/B是否反接、终端电阻、波特率一致


FPGA收到帧但回帧错误 FreeModbus CRC计算错或UART中断丢失 → 打开 MB_FUNC_DEBUG 打印十六进制


写HR值FPGA不响应 确认 eMBRegHoldingCB 中地址偏移 usAddress-1 正确,且HR数组足够大


偶发帧丢失(多从站) 降低波特率(例9600→19200)或加总线空闲延迟(T3.5字符)


TCP模式无法连从站 确认FPGA IP/Port(502)、防火墙关、ARP表有MAC


五、扩展:Modbus TCP + Zynq PS侧


若用Zynq,可在PS端运行 lwIP + FreeModbus TCP,PL逻辑通过BRAM与PS共享保持寄存器:

// PS侧应用层

xMBTCPAccept( sock );

eMBPoll();

// 在 eMBRegHoldingCB 中读写 ps_shared_bram[]



PLC侧改用 MB_CLIENT 指向 FPGA IP:502,其余寄存器规划不变。


六、结语


PLC与FPGA协同的Modbus实现可总结为三点:① 规划好保持寄存器地址与含义(控制/参数/反馈/状态)→ ② FPGA跑FreeModbusSlave并实现eMBRegHoldingCB映射 → ③ PLC用Modbus_Master/MB_CLIENT按周期读写。该方案成本低、兼容性强,且便于后期扩展多FPGA从站或切换为Modbus TCP。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在Xilinx FPGA开发中,Vivado HLS(High-Level Synthesis) 是把C/C++/SystemC算法“翻译”成RTL(Verilog/VHDL)并封装为可重用IP核的利器。相比手写RTL,...

关键字: Vivado FPGA Xilinx

我们都经历过这种情况:模拟器看起来完美无缺,比特流第一次加载就成功了,可板子却……静止不动,做着奇怪的事,又不肯解释。这时你只能拿起厂商的调试工具,接受被绑在他们IDE上的命运,或者干脆在设计上撒满LED灯,像撒 bre...

关键字: FPGA 计数器 BRS-100-GW1NR999

在FPGA/ASIC设计中,跨时钟域(CDC,Clock Domain Crossing) 是时序违例与功能Bug的高发区。单比特信号、多比特总线、脉冲需采用不同同步策略。本文给出三种经典CDC方案的RTL实现,并对比S...

关键字: 跨时钟域 FPGA

在高速ADC采集系统中,数字下变频(Digital Down Converter, DDC) 负责将高中频采样信号搬移到基带(或低中频),并完成降采样(Decimation)与抗混叠滤波,是雷达、软件无线电接收链路的标配...

关键字: FPGA DDC

在基于CODESYS Runtime的软PLC(如倍福CX、WAGO、汇川AM600、自家移植Runtime)项目中,开发流程与三菱/西门子硬PLC有明显差异——更强调设备描述(EDS/XML)、任务配置与IEC 611...

关键字: CODESYS PLC

在老旧产线改造中,常有大量RS485 Modbus RTU设备(温湿度、电表、变频器)需要接入上位机或MES,但它们不支持TCP。此时用Raspberry Pi(树莓派)运行Modbus TCP↔RTU网关程序,既能做协...

关键字: Raspberry Modbus TCP网关

在FPGA中例化DDR4 SDRAM控制器(如Xilinx MIG或Intel UniPHY)后,正确的时序约束(SDC)是让控制器通过时序签核、稳定跑在目标频率(如2400MT/s)的前提。很多"初始化失败"或"校准不...

关键字: FPGA DDR4 时序约束

在FPGA开发中,“时序不收敛”(Timing Closure Failed)是让工程师最头疼的问题之一。当WNS(最差负余量)为负时,设计无法在目标频率下稳定运行。本文总结五大系统性排查思路,帮助你在Vivado/Qu...

关键字: FPGA 时序收敛

在Xilinx UltraScale+系列FPGA中,片上存储器分为BRAM(Block RAM)和URAM(Ultra RAM)两类。BRAM容量18/36Kb,URAM容量288Kb,但URAM延迟略高且占用更多布线...

关键字: FPGA BRAM URAM

在FPGA网络中,以太网MAC(Media Access Control)负责CSMA/CD退避、帧校验(FCS)、与PHY通过MII/RGMII/SGMII接口交互。根据项目对灵活性、开发周期、资源的要求,通常有三种实...

关键字: FPGA 以太网
关闭