> 技术文档 > TSMaster-C小程序使用_tsmaster脚本

TSMaster-C小程序使用_tsmaster脚本

TSMaster-C小程序使用_tsmaster脚本
打开同星的TSMaster,推荐用32版本的,比64更稳定。同星的TSMaster的C小程序支持用户嵌入代码来控制CAN报文的收发逻辑。便于开发。

TSMaster-C小程序使用_tsmaster脚本
点击设计里面的C小程序。

比如我现在想用小程序来实现继电器0先开后关开1s关1s,然后继电器1开1s关1s…如此往复到继电器39
定义全局变量
TSMaster-C小程序使用_tsmaster脚本
TSMaster-C小程序使用_tsmaster脚本

if(flag){ flag = 0; CAN_Data[0] = relay_ch; CAN_Data[1] = 0x0; { // [1] CAN 0x240D BOB_BOX_SET_ONE_RELAY_STATE_REQ 控制单个继电器 TCAN f0 = {0,0x5,2,0,0x240D,0,{0}}; memcpy(f0.FData, CAN_Data, 8); com.transmit_can_async(&f0); app.wait(0, \"\"); } relay_ch++; if(relay_ch == 40) relay_ch = 0; }else{ flag = 1; CAN_Data[0] = relay_ch; CAN_Data[1] = 0x1; { // [1] CAN 0x240D BOB_BOX_SET_ONE_RELAY_STATE_REQ 控制单个继电器 TCAN f0 = {0,0x5,2,0,0x240D,0,{0}}; memcpy(f0.FData, CAN_Data, 8); com.transmit_can_async(&f0); app.wait(0, \"\"); }}

可以直接报文转化为C脚本
TSMaster-C小程序使用_tsmaster脚本

也可以根据帮助手册手写。
TCAN类型是什么?可以在TSMaster.h里面看到。
TSMaster-C小程序使用_tsmaster脚本

// CAN frame type ================================================typedef struct _TCAN{ u8 FIdxChn; u8 FProperties; u8 FDLC; u8 FReserved; s32 FIdentifier; s64 FTimeUs; u8 FData[8]; // is_tx ----------------------------------------------------- bool get_is_tx(void) { return (FProperties & MASK_CANProp_DIR_TX) != 0; } void set_is_tx(const bool value) { if (value) { FProperties = FProperties | MASK_CANProp_DIR_TX; } else { FProperties = FProperties & (~MASK_CANProp_DIR_TX); } } __declspec(property(get = get_is_tx, put = set_is_tx)) bool is_tx; // is_data ---------------------------------------------------- bool get_is_data(void) { return (FProperties & MASK_CANProp_REMOTE) == 0; } void set_is_data(const bool value) { if (value) { FProperties = FProperties & (~MASK_CANProp_REMOTE); } else { FProperties = FProperties | MASK_CANProp_REMOTE; } } __declspec(property(get = get_is_data, put = set_is_data)) bool is_data; // is_std ----------------------------------------------------- bool get_is_std(void) { return (FProperties & MASK_CANProp_EXTEND) == 0; } void set_is_std(const bool value) { if (value) { FProperties = FProperties & (~MASK_CANProp_EXTEND); } else { FProperties = FProperties | MASK_CANProp_EXTEND; } } __declspec(property(get = get_is_std, put = set_is_std)) bool is_std; // is_err ---------------------------------------------------- bool get_is_err(void) { return (FProperties & MASK_CANProp_ERROR) != 0; } void set_is_err(const bool value) { if (value) { FProperties = FProperties | MASK_CANProp_ERROR; } else { FProperties = FProperties & (~MASK_CANProp_ERROR); } } __declspec(property(get = get_is_err, put = set_is_err)) bool is_err; // load data bytes ------------------------------------------- void load_data(u8* a) { for (u32 i = 0; i < 8; i++) { FData[i] = *a++; } } void set_data(const u8 d0, const u8 d1, const u8 d2, const u8 d3, const u8 d4, const u8 d5, const u8 d6, const u8 d7){ FData[0] = d0; FData[1] = d1; FData[2] = d2; FData[3] = d3; FData[4] = d4; FData[5] = d5; FData[6] = d6; FData[7] = d7; } // initialize with standard identifier ----------------------- void init_w_std_id(s32 AId, s32 ADLC) { FIdxChn = 0; FIdentifier = AId; FDLC = ADLC; FReserved = 0; FProperties = 0; is_tx = false; is_std = true; is_data = true; *(u64*)(&FData[0]) = 0; FTimeUs = 0; } // initialize with extended identifier ----------------------- void init_w_ext_id(s32 AId, s32 ADLC) { FIdxChn = 0; FIdentifier = AId; FDLC = ADLC; FReserved = 0; FProperties = 0; is_tx = false; is_std = false; is_data = true; *(u64*)(&FData[0]) = 0; FTimeUs = 0; }} TCAN, *PCAN;