首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么samd21将modbus自己的响应作为主请求读取?

为什么samd21将modbus自己的响应作为主请求读取?
EN

Stack Overflow用户
提问于 2020-07-16 08:15:41
回答 1查看 280关注 0票数 1

我正在通过RS-485 (通过芯片ADM2587EBRWZ)将从MODBUS RTU通信添加到SAMD21现有程序中。只读保持寄存器和写单一寄存器命令实现,因为我不需要更多。

为了测试它,我使用微信的PLC作为主控。我让它运行了几个小时,但是日志显示了一些-3333值(Microcom使用-3333来表示在读取寄存器时发生了错误)。在查看plc终端时,我注意到,如果应答消息以"00 CRC_lo 00“结尾,那么下一个请求就是一个错误。如果在Atmelstudio上调试,ATSAMD21读取相同的答案并作为请求检测它,给出一个非法的数据地址响应给PLC。

在回答之后,我在端口上做了一个usart_reset并清理了消息数组,知道它是什么吗?

注:我对C编程很陌生,英语不是我的第一语言。

编辑:增加了更多的代码,如果需要什么,我可以张贴它。这个部分在主回路上:

代码语言:javascript
复制
while(ReceivedCommand_MODBUS() ==false)
{
    UartReadJob_MODBUS();
}                       
AnalyzeReceiveCommand_MODBUS();

第一项职能是:

代码语言:javascript
复制
bool ReceivedCommand_MODBUS()
{   
    uint16_t CRC=0;
    CRC = CRC16(CommandReadBuffer_MODBUS,6);
    if ((CommandReadBuffer_MODBUS[CommandReadLength-1] == ((CRC & 0xFF00)>>8)) && (CommandReadBuffer_MODBUS[CommandReadLength-2]) == (CRC & 0x00FF) )
{
    return true;
}

if ((CommandReadLength - 1 )>= RS485_COMMAND_LENGTH)
{
    CommandReadLength = 0;  
    memset(CommandReadBuffer_MODBUS, 0, sizeof(CommandReadBuffer_MODBUS));
}
return false;
}

最后一个是:

代码语言:javascript
复制
void AnalyzeReceiveCommand_MODBUS()
{
    uint32_t receiveLength = 0;
    uint8_t receiveCommand[COMMAND_READ_BUFFER_LENGTH_MODBUS];
    memset(receiveCommand, 0, COMMAND_READ_BUFFER_LENGTH_MODBUS);   
    ReadCommand_MODBUS(receiveCommand, &receiveLength);
    uint16_t CRC = 0;
    
    //Modbus request is read and response generated here

    SendMaster_MODBUS(messageData,MessageSize);                         
    delay_ms(10);    //delays are for breakpoints
    UartReset(&UART1);
    for (char i=0;i<=MessageSize+1;i++)
    {
        UartReceiveBuffer_MODBUS[i]=0;
        UartSendBuffer_MODBUS[i]=0; 
        messageData[i]=0;
    }
    void ResetBuffer_MODBUS ();
    delay_ms(10);
}

ReadCommand_MODBUS功能:

代码语言:javascript
复制
void ReadCommand_MODBUS(uint8_t* command, uint32_t* length)
{
    *length = CommandReadLength;
    memcpy(command, CommandReadBuffer_MODBUS, CommandReadLength);
    CommandReadLength = 0;
    memset(CommandReadBuffer_MODBUS, 0, sizeof(CommandReadBuffer_MODBUS));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-21 09:50:21

现在,它似乎起作用了,在发送响应消息之后调用它:

代码语言:javascript
复制
void ResetBuffer_MODBUS ()
{
    memset(CommandReadBuffer_MODBUS, 0, sizeof(CommandReadBuffer_MODBUS));
}

到目前为止还没有出现错误,会让它运行一段时间,但在此之前,它已经失败了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62930394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档