用于modbus从站的C ++查找表

时间:2015-12-15 19:55:39

标签: c++ multithreading modbus

我有C固件实现了modbus slave。一旦接收到我的RTU命令(比如func 03“寄存器读取”),我只需转到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 slave一样。我打算将系统的机制包装成三个类。每个类都在堆上创建,并启动它的自己的线程等待来自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,
                     ...
                     };
   };       
};

非常感谢任何想法或替代设计。

1 个答案:

答案 0 :(得分:0)

如果我理解了你的问题,你就不必实现某种线程安全机制,多线程你必须担心资源争用时,使用modbus协议你有单独的地址和注册地址,通信机制是基于答案/回复的,所以主人要求做某事,只有感兴趣的奴隶在笔记地址上做那件事。 您可以使用您的线程来处理信息并使用管理器来启动正确的线程。如果你严格遵守标准协议,那就没有并发性,你不必担心。 也许我们可以在确定你的线程将完全做什么时考虑一些事情。 如果你没有任何特殊问题,我认为你的单线程版本就足够了!