C++查找modbus从机的表

C++ look-up-table for modbus slave

本文关键字:查找 modbus C++      更新时间:2023-10-16

我有一个实现modbus从机的C固件。一旦收到我的RTU命令(比如func 03"register read"),我只需转到LUT并获取需要返回的数据。我的数据结构是全局的。我的数组看起来像这样:

int* modbusLUT[]={
                   &motorControl_t.counter.degrees,
                   &motorControl_t.counter.dir,
                   &glueControl_t.nozzle.temp,
                   &paintControl_t.hopper.level,
...
};

我构建了modbus回复,内容如下:

temp = *modbusLUT[startAddr+j];
...

这个单线程代码非常有效。

我现在正在编写单独的C++"系统管理器"代码,这是必不可少的无头代码,它也必须像modbus从属程序一样工作。我打算把这个系统的力学分为三类。每个类都在堆上创建,并启动它自己的线程,等待main()中的事件。类似这样的东西:

m_ptrMotorMachine = new CMotorMachine();
m_ptrGlueMachine  = new CGlueMachine();
m_ptrPaintMachine = new CPaintMachine();
...
m_ptrGlueMachine->m_pThread->PostThreadMesageA(SW_PART_IN_PLACE,0,0);

我需要所有三个可用类的参数(成员变量),以便我的modbus处理程序可以访问和读取/写入它们。。。理想情况下就像上面的C数组。

那么,我怎样才能在C++中安全地完成上述操作呢?需要锁吗?类似这样的伪代码:

class CModBusSlave{
void initLUT()
   {
    int* modbusLUT[]={
                     &m_ptrMotorMachine->velocity,
                     &m_ptrMotorMachine->accel,
                     &m_ptrGlueMachine->psi,
                     &m_ptrPaintMachine->stroke,
                     ...
                     };
   };       
};

任何想法或替代设计都将不胜感激。

如果我理解你的问题,你就不必实现某种线程安全机制,当资源被争用时,你必须担心多线程,使用modbus协议,你有单独的地址和注册地址,通信机制是基于应答/应答的,所以主设备要求做某事,只有感兴趣的从设备在通知地址上做这件事。您可以使用线程来处理信息,并使用管理器来启动正确的线程。如果您严格遵守标准协议,就不会有并发性,所以您不必太担心。也许我们可以在您定义了线程将要执行的操作后进行思考。如果你没有任何特别的问题,我认为你的单线程版本就足够了!