打開同星的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;