TSMaster-C小程序使用
打开同星的TSMaster,推荐用32版本的,比64更稳定。同星的TSMaster的C小程序支持用户嵌入代码来控制CAN报文的收发逻辑。便于开发。
点击设计里面的C小程序。
比如我现在想用小程序来实现继电器0先开后关开1s关1s,然后继电器1开1s关1s…如此往复到继电器39
定义全局变量
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脚本
也可以根据帮助手册手写。
TCAN类型是什么?可以在TSMaster.h里面看到。
// 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;