Simulink CAN PACK Message总线解包及处理

Simulink CAN PACK Message总线解包

开发环境:本项目是基于simulink 2019a完成。
项目背景:需要在发出去的CANmessage中加载CRC16数据。
实现方案如下:
项目中要用到pack加载dbc,但data区后两字节需要加载CRC16,CRC16计算的数据为前6字节,而pack前均为信号量,故需要对pack后的封包数据进行提取解封,然后处理CRC然后再合并数据总线成CAN message BUS。网上找了许久也没有相关资源,就自己做了一个示例,验证运行正常。希望可以帮到和我一样对汽车CAN总线解包封包有需求的。
** 模型整体框图如下 **
Simulink CAN PACK Message总线解包及处理_第1张图片
** CRC子函数展开框图如下 **

Simulink CAN PACK Message总线解包及处理_第2张图片
模型中用到了BUS selector,create BUS 模块进行解包和封包。
CRC使用的是MATLAB Function实现。语言为M语言。

function CAN_Message = Modbus_CRC16(message)
CAN_Message =uint8(zeros(8,1));
crc_reg =  uint16(hex2dec('0000'));
crc_reg_xor =  uint16(hex2dec('0000'));
CRC_poly = uint16(hex2dec('C86C'));
for ii = 1:6     %length(message))
    CAN_Message(ii)=message(ii);
    data_s=uint16(message(ii));
    current = bitshift(data_s,8);%左移8位
    for jj = 1:8
        crc_reg_xor = bitxor(crc_reg,current);
        if bitget(crc_reg_xor,16) == 1
            crc_reg = bitxor(bitshift(crc_reg,1),CRC_poly);%uint16(51308)
        else
            crc_reg = bitshift(crc_reg,1);
        end
        current = bitshift(current,1);
    end
end

CAN_Message(7)=bitand( crc_reg, uint16(255));%uint8(mod(crc_reg,1e8));
CAN_Message(8)=uint8(bitshift(crc_reg,-8));

其中新建CAN message BUS 遇到过一点小麻烦,就是BUS总线中再包含data[8],通过对create BUS 设置后解决。

希望以上能帮到和我有一样问题的同学。
代码连接地址:
https://download.csdn.net/download/weixin_43255491/12245007

你可能感兴趣的:(CAN,PACK)