《LDF文件详细步骤及内容解析》

LDF文件第一部分——ldf文件配置

LIN_description_file;  //LIN描述文件 
LIN_protocol_version = 2.1;//LIN协议版本 
LIN_language_version = 2.1; //LIN语言版本 
LIN_speed = 19.2 kbps;   //LIN的通信速度

第一部分是必不可少的,属于全局定义。我们可以把等号左边的看作固定值,右边的看作变量或者参数进行理解,比如version可以为2.0、2.1、2.2,版本要一致,不然版本不兼容,生成的ldf文件就报错

LIN的通信速度是以kbps(每秒千比特率)为单位的,范围是1.0-20.0ksps,一般由19.2和9.6这两个参数

LDF文件第二部分——节点定义

Nodes
{
   Master: BCM,,5 ms, 0.1 ms;  //主机节点,名称:ECC,时基:5ms,抖动:0.1ms
   Slaves: RLS, IP;  // 从机节点名称:RLS,IP
}

抖动(Jitter)为帧的同步间隔段的下降沿与帧时隙起始时刻相差的时间。时基(Time Base)为LIN子网的最小计时单位,通常设定为5ms或10ms。

帧时隙必须为时基的整倍数,并且起始于时基的开始时刻(称为时基的节拍(Tick)),切换到另一个进度表时一定要等到当前帧时隙的结束

从机节点注意不要主机节点设置进去,如果自己写脚本或者程序,注意判断从机节点这一列是否打了X或者被调用,如果没有被调用就不要加。加了应该也没事(狗头)

LDF文件第三部分——信号定义

Signals 
{

    KeyInSts:               1, 0, BCM, IP;  //信号名称:KeyInSts,size_bit=1,初始默认值=0 ,发送节点=BCM,接收节点IP

    AmbientTemperature:    	8, 100, BCM, RLS,IP;  //信号名称:AmbientTemperature,size_bit=8,初始值=100,发送节点=BCM,接收节点=RLS,IP
   
    LowBeamReq:               24, {0,0,0}, RLS, BCM;
  //信号名称:LowBeamReq,size_bit=24,初始值={0,0,0},以数组形式呈现,发送节点=RLS,接收节点=BCM
} 

size_bit小于等于16时,信号的类型是Scalar,初始默认值为16进制,需要进行转换,如果为空默认为0,大于16时就是Byte Array(字节数组)

size_bit后的第一个值为发送节点,发送节点只能有一个

发送节点之后的全部都是接收节点,接收节点可以有多个

LDF文件第四部分——设置默认的诊断数据

Diagnostic_signals {
  MasterReqB0: 8, 0 ;   主节点名称:8bit ,默认为0
  MasterReqB1: 8, 0 ;
  MasterReqB2: 8, 0 ;
  MasterReqB3: 8, 0 ;
  MasterReqB4: 8, 0 ;
  MasterReqB5: 8, 0 ;
  MasterReqB6: 8, 0 ;
  MasterReqB7: 8, 0 ;
  SlaveRespB0: 8, 0 ;   从节点名称:8bit ,默认为0
  SlaveRespB1: 8, 0 ;
  SlaveRespB2: 8, 0 ;
  SlaveRespB3: 8, 0 ;
  SlaveRespB4: 8, 0 ;
  SlaveRespB5: 8, 0 ;
  SlaveRespB6: 8, 0 ;
  SlaveRespB7: 8, 0 ;
}                           

默认设置无需更改

LDF文件第五部分——数据帧定义

Frames { //帧定义
    BCMSts1: 	0x2,   BCM,  3 {   //帧名称:BCMSts1,帧ID:0x2,帧的发布节点:BCM,帧数据段字节
	   KeyInSts,                     0;  
//帧的信号名称:KeyInSts,对应列Messagename  帧中的偏移量:0,对应列LSB
            HighBeamCmdSts,               1;
            LeftTurnLampSts,              2;
            RightTurnLampSts,             3;    
            LeftPositionlLampSts,         4;    
            RightPositionlLampSts,        5; 
            LeftPosLampFailSts,           6;
            RightPosLampFailSts,          7; 
            LHFDoorSts,                     8;
            LHRDoorSts,                     9;
            RHFDoorSts,                     10;
            RHRDoorSts,                     11;
            RearLidSts,                     12;
            DashboardBrightness,            13;
            KeySts,                         16;        
		}
  
    BCMSts2: 3, BCM, 3 {  //十进制帧ID
            WiperSwitchSts,                  0; //帧的信号名称,帧中的偏移量
            RLSSensitivityReq,               3;
            VehicleSpeed,                    8; 
            RearLidSts,                     12;
            DashboardBrightness,            13;
            AmbientTemperature,              16; 
            RearLis,                        12;
            DashboardBrig,                   13;
           
    }
}

一个帧的帧ID可以是十六进制的也可以是十进制的

帧中信号的偏移量只能越来越高,从底到高顺序,最小值0,最大值为63,如果有其他帧信号,可以继续添加

LDF文件第六部分——诊断帧

Diagnostic_frames { //诊断帧
    MasterReq: 0x3c {  // 主节点诊断发送帧:MasterReq,帧ID:0x3c或者十进值60
      MasterReqB0, 0 ;
      MasterReqB1, 8 ;
      MasterReqB2, 16 ;
      MasterReqB3, 24 ;
      MasterReqB4, 32 ;
      MasterReqB5, 40 ;
      MasterReqB6, 48 ;
      MasterReqB7, 56 ;
    }
    SlaveResp: 0x3d {  // 从节点诊断接收帧:SlaveResp,帧ID:0x3D或者十进值61
      SlaveRespB0, 0 ;
      SlaveRespB1, 8 ;
      SlaveRespB2, 16 ;
      SlaveRespB3, 24 ;
      SlaveRespB4, 32 ;
      SlaveRespB5, 40 ;
      SlaveRespB6, 48 ;
      SlaveRespB7, 56 ;
    }
}
诊断帧的值和数据为固定的,不需要更改

LDF文件第七部分——从节点属性定义

Node_attributes  { //从节点属性定义,与第二部分节点定义映射
	IP {// 从节点名称
		LIN_protocol = "2.1"; //与第一部分ldf文件配置映射
		configured_NAD = 0x68;  // NAD值范围为1-255,可以使用十六进制值,也可使用十进制
		product_id = 
			0x2,               // supplier_id (0-0x7FFE)  供应商id
			0x1,               // function_id (0-0xFFFE)  功能id
			0x1;                   // variant (0-0xFF)   可变id
		response_error = IPErrorSts;  // 1比特错误信号 可不加
 		P2_min = 50 ms;       //  最小间隔
 		ST_min = 0 ms;       //  最小准本时间
 		N_As_timeout = 500 ms;  // 非必要 诊断帧传输时间
        N_Cr_timeout = 1000 ms; // 非必要 上一帧到下一个连续帧的发完的时间
       configurable_frames
        {
         BCMSts1 ;  //message name 或 message id 消息名称或消息id,与上文第五部分数据帧定义映射
         IPSts;
        }
	} 
} 

P2_min: 从 LIN 子网接收到主机请求帧到 LIN 的从机节点准备好数据发送应答之间的最小时间间隔。

ST_min: 从机节点准备接收下一个帧(主机请求帧)或准备发送下一个帧(从机应答帧)的应答部分所需要的最小准备时间。

LDF第八部分——调度表信息

Schedule_tables {
 LIN2NormalTable_IGNON { // 调度表
    BCMSts2 delay 30 ms ; // 帧的延时
    RLSSts delay 30 ms ;
  }
 LIN2NormalTable_IGNOFF {
    BCMSts1 delay 15 ms ;
    BCMSts2 delay 15 ms ;
    IPSts delay 15 ms ;
    RLSSts delay 15 ms ;
  }
}

除了帧延时lin2.1版本默认Max.Frame Time[ms]为9.05,Min.Frame Time[6.46]

一个调度表会将所有帧延时加起来

调度表可以有多个,比如进度表、诊断发送表、诊断应答表等

LDF第九部分——信号编码定义

Signal_encoding_types{
    KeyInSts_Encoding{//信号名称加上_Encoding
	physical_value, 0, 254, 1.417, 	0, "VehicleSpeed";
//类型,计算机最小值,计算机最大值,精度(factor),偏差(offset),单位(Unit),没有可以不加
        logical_value, 0, "Close";  //表示类型是coding:logical_value,序号0,对应的是矩阵十六进制数字,coding值=Close
        logical_value, 1, "Open";  //表示类型是coding:logical_value,序号1,对应的是矩阵十六进制数字,coding值=Open
	} 

   HighBeamCmdSts_Encoding{
        physical_value, 0, 254, 0.5, -40,"AmbientTemperature";
//类型,计算机最小值,计算机最大值,精度(factor),偏差(offset),单位(Unit):AmbientTemperature,没有可以不加
        logical_value, 0, "No"; 
        logical_value, 1, "Yes"; 
    }

   LeftTurnLampSts_Encoding{
		physical_value, 0, 4, 1, 0, "DashboardBrightness";
        logical_value, 0, "Sensitivity 1"; 
        logical_value, 1, "Sensitivity 2";
        logical_value, 2, "Sensitivity 3"; 
        logical_value, 3, "Sensitivity 4";
        logical_value, 4, "Sensitivity 5"; 
        logical_value, 5, "Not Used";  
        logical_value, 6, "Not Used"; 
        logical_value, 7, "Not Used"; 
        如果数值太多,可以这样写
        logical_value, 5, "0x5~0x7,Not Used";  
	} 
 
}

获取计算机最大值最小值,需要进行计算,步骤如下:

如果偏移量大于等于0

计算机最大值(计算机最小值) = (物理最大值(物理最小值) – 偏移量)/ 精度(factor)

如果偏移量大于0

计算机最大值(计算机最小值) = (物理最大值(物理最小值) + 偏移量)/ 精度(factor)

LDF第十部分——信号coding和信号名称映射

Signal_representation {
  KeyInSts_Encoding: KeyInSts  // 信号coding和信号名称映射
  HighBeamCmdSts_Encoding: HighBeamCmdSts
  LeftTurnLampSts_Encoding:  LeftTurnLampSts
  }
 本质上就是将物理值(physical_value)和coding值添加到对应的信号中去

如果写的脚本仅供自己使用的话,能读取Excel数据的语言都可以,优先选择有LDF API的语言。但是如果想做成工具、程序(exe)我推荐java,但我用的是python,因为python的数据转换比较麻烦,而且灵活度不如java。如果做成小工具的话java可以使用javafx,里面有图形化工具,非常方便,python生成的小工具我用的是图形化界面是PySimpleGUI比较难调整

生成dbc文件的话,推荐使用python,因为python内置的有dbc核心API,可以调用dbc核心api进行转换非常方便

原文:(10条消息) LIN ldf文件配置_allen_nmk的博客-CSDN博客_ldf中的jitter如何设置对其补充说明

物联沃分享整理
物联沃-IOTWORD物联网 » 《LDF文件详细步骤及内容解析》

发表评论