当前位置: 首页 > news >正文

TSMaster常用函数

一、报文类

1、CAN报文的发送

方法一:

方法二:

  //CAN报文的发送/*定义CAN的结构体为:0表示CH1;属性0x1表发送,0x0表接收;DLC长度;默认0(预留以保持对齐状态);标识符;时间戳延时0us;数据Data*/TCAN f0 = {0, 0x1, 8, 0, 0x111, 0, {0x1, 0x22, 0x33, 0x12, 0x15, 0x25, 0x30, 0x40}};com.transmit_can_async(&f0); //异步发送CAN帧,不检查其传输结果(参数是结构体指针)app.wait(0, ""); //相当于延时,第一个参数是ms单位,第二个参数是输出的字符串log("发送成功"); //打印(输出)类似与c的printf()

(1)这里需要了解一下CAN报文的结构体:

     
// CAN frame type (CAN报文的结构体)================================================
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;

2、CAN FD报文的发送

  //在CAN通道1上传输CAN FD帧(0x55)
TCANFD c;
c.init_w_std_id(0x55, 8);   //该函数就是只需两个参数,帮你初始化报文,注意是CH0即通道1if (0 != app.connect()) return;    //判断软件是否连接成功
if (0 == com.transmit_canfd_async(&c))  //判断是否发送成功
{log("CAN FD message 0x%03x has been pushed into transmit queue", c.FIdentifier);
}

(1)这里需要了解一下CAN FD报文的结构体:

// CAN FD frame type (CAN FD的结构体)===========================================
typedef struct _TCANFD{u8 FIdxChn;u8 FProperties; //0-RX,1-TXu8 FDLC;u8 FFDProperties; //0-CAN帧,1-CAN FD帧s32 FIdentifier;s64 FTimeUs;u8  FData[64];// 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;// is_edl ----------------------------------------------------bool get_is_edl(void){ return (FFDProperties & MASK_CANFDProp_IS_FD) != 0;}void set_is_edl(const bool value){if (value) {FFDProperties = FFDProperties | MASK_CANFDProp_IS_FD;} else {FFDProperties = FFDProperties & (~MASK_CANFDProp_IS_FD);}}__declspec(property(get = get_is_edl, put = set_is_edl)) bool is_edl;// is_brs ----------------------------------------------------bool get_is_brs(void){ return (FFDProperties & MASK_CANFDProp_IS_BRS) != 0;}void set_is_brs(const bool value){if (value) {FFDProperties = FFDProperties | MASK_CANFDProp_IS_BRS;} else {FFDProperties = FFDProperties & (~MASK_CANFDProp_IS_BRS);}}__declspec(property(get = get_is_brs, put = set_is_brs)) bool is_brs;// is_esi ----------------------------------------------------bool get_is_esi(void){ return (FFDProperties & MASK_CANFDProp_IS_ESI) != 0;}void set_is_esi(const bool value){if (value) {FFDProperties = FFDProperties | MASK_CANFDProp_IS_ESI;} else {FFDProperties = FFDProperties & (~MASK_CANFDProp_IS_ESI);}}__declspec(property(get = get_is_esi, put = set_is_esi)) bool is_esi;// load data bytes -------------------------------------------void load_data(u8* a) {for (u32 i = 0; i < 64; i++) {FData[i] = *a++;}}// initialize with standard identifier -----------------------void init_w_std_id(s32 AId, s32 ADLC) {s32 i;FIdxChn = 0;FIdentifier = AId;FDLC = ADLC;FProperties = 0;FFDProperties = MASK_CANFDProp_IS_FD;is_tx = false;is_std = true;is_data = true;for (i = 0; i < 64; i++) FData[i] = 0;FTimeUs = 0;}// initialize with extended identifier -----------------------void init_w_ext_id(s32 AId, s32 ADLC) {s32 i;FIdxChn = 0;FIdentifier = AId;FDLC = ADLC;FFDProperties = MASK_CANFDProp_IS_FD;FProperties = 0;is_tx = false;is_std = false;is_data = true;for (i = 0; i < 64; i++) FData[i] = 0;FTimeUs = 0;}// get fd data length ----------------------------------------s32 get_data_length() {s32 l = MIN(FDLC, 15);l = MAX(l, 0);return DLC_DATA_BYTE_CNT[l];}// to CAN struct ---------------------------------------------TCAN to_tcan(void){return *(TCAN*)(&FIdxChn);}
} TCANFD, *PCANFD;

3、LIN报文的发送

LIN报文发送比较复杂一点,要设置主从节点,配置调度表,并且需要硬件才能进行验证

//LIN报文的发送//1.配置节点模式
#define MASTER_MODE  0
#define SLAVE_MODE   1
#define CHANNEL1 0   //LIN通道1
#define CHANNEL2 1   //LIN通道2//2.构造LIN报文帧
TLIN tx_msg;
tx_msg.init_w_id(0x30, 8);  //第二个参数是数据的长度
tx_msg.FIdxChn = CHANNEL1;
tx_msg.is_tx = true;    //3.加载数据内容
u8 data[8] = {1,1,2,2,3,3,4,4};
tx_msg.load_data(data);//4.设置主从节点
com.lin_set_node_functiontype(CHANNEL1, MASTER_MODE);
com.lin_set_node_functiontype(CHANNEL2, SLAVE_MODE);//5.停止通道,准备编辑调度表
com.lin_stop_lin_channel(CHANNEL1);
com.lin_batch_set_schedule_start(CHANNEL1);
com.lin_batch_add_schedule_frame(CHANNEL1, &tx_msg, 15);
com.lin_batch_set_schedule_end(CHANNEL1);
com.lin_start_lin_channel(CHANNEL1);

LIN报文结构体

// LIN frame type ================================================
typedef struct _LIN {u8  FIdxChn;u8  FErrStatus; //0-正常u8  FProperties; //0-RX,1-TXu8  FDLC;u8  FIdentifier; //0--64u8  FChecksum;u8  FStatus; //占位符1s64 FTimeUs;u8  FData[8];// is_tx -----------------------------------------------------bool get_is_tx(void){return (FProperties & MASK_LINProp_DIR_TX) != 0;}void set_is_tx(const bool value){if (value) {FProperties = FProperties | MASK_LINProp_DIR_TX;}else {FProperties = FProperties & (~MASK_LINProp_DIR_TX);}}__declspec(property(get = get_is_tx, put = set_is_tx)) bool is_tx;// load data bytes -------------------------------------------void load_data(u8* a) {for (u32 i = 0; i < 8; i++) {FData[i] = *a++;}}// initialize with identifier --------------------------------void init_w_id(const s32 AId, const s32 ADLC) {FIdxChn = 0;FErrStatus = 0;FProperties = 0;FDLC = ADLC;FIdentifier = AId;*(__int64*)(&FData[0]) = 0;FChecksum = 0;FStatus = 0;FTimeUs = 0;}
}TLIN, *PLIN;

二、仿真类

1、通过c小程序实现RBS仿真和信号的修改相关的函数

//1.通过地址来获取信号的值,参数1为地址路径,参数2为将获取的值赋值给这个double变量
com.can_rbs_get_signal_value_by_address("0/ARINC825/FlightState/BodyPitchAngle/BodyPitchAngle", &Pitch_Angle);//2.通过地址来设置信号的值
com.can_rbs_set_signal_value_by_address("0/CAN_FD_Powertrain/Engine/EngineData/Gear", vGear / 20);//3.设置系统变量的值,参数1为系统变量名称,参数为要设置的值
app.set_system_var_int32("Aircraft_Angle", Pitch_Angle);//4.获取当前测量的PC时间戳
s64 t;
app.get_timestamp(&t)//放在程序启动事件相关的函数
/*5.CAN RBS配置
参数1连接程序时rbs是否自启动,
参数2如果信号被修改,是否自动发送修改后的消息,仅对非循环消息有效
参数3是否激活节点行为模拟
参数4为枚举类型,下面代表参数代表为0
*/
// typedef enum {rivUseDB = 0, rivUseLast, rivUse0} TLIBRBSInitValueOptions;
com.can_rbs_configure(false, true, true, rivUseDB);//6.启动rbs
com.can_rbs_start();//7.定时器启动(自定义的)延时100ms
Timer100ms.start();//8.停止rbs
com.can_rbs_stop();

三、CRC与RC仿真(计算CAN报文的CRC示例)

checksum algorithm(校验和算法)

1、自定义的检验和算法:

#define cb_CRC_POLY 0x52
u8 crc = 0x12; //设置CRC的初始值
u8 byte_index; //字节索引
u8 bit_index;  //位索引
// CRC8 demo 
for(byte_index=0; byte_index < ALen; byte_index++){crc ^= *(AData + byte_index);  //当前CRC值与数据字节进行异或for(bit_index=0; bit_index<8; bit_index++){ // 处理每个字节的8个位if(crc & 0x80){	// 检查最高位是否为1,即1000 0000 2的8次方为256crc = (crc << 1) ^ cb_CRC_POLY; // 如果为1,左移并异或多项式} else {crc = (crc << 1);  // 如果为0,只进行左移}}		
}
return 255 - crc;  // 返回CRC的补码

2、预发送事件中设置数据库中ABSdata报文的CRC和RC


// checksum byte is on byte index 10, with signal name "DemoChecksum"
// rolling counter is on byte index 11, with signal name "DemoRollingCounter"TABSdata_1 ABSdata_1;  //定义这个报文
ABSdata_1.init(); // execute this init function before use 初始化
ABSdata_1.FCAN = *ACANFD; //将CANFD结构体指针指向这个报文的CAN结构体// make rolling counter from 0~15 做RC的取值范围为0-15
u8 c = RC.get() + 1;  //RC是在c小程序中创建的变量,获取RC的值
if (c >= 16) c = 0;
RC.set(c);            //设置RC的值
ABSdata_1.DemoRollingCounter = c; //将这个RC的值赋值给这个报文的RC// make checksum, protect range from byte 0 to 9 //做检验和,保护字节从0-9
//自定义的计算检验和的函数,参数1为指针类型的数据,参数2为长度
ABSdata_1.DemoCheckSum = MakeCheckSum(&ABSdata_1.FCAN.FData[0], 10);// 将数据写回传输缓存区中
*ACANFD = ABSdata_1.FCAN;

3、可以看到RC和CRC的范围变化

四、报文周期类

1、图形类


//在图形用户界面中清除信号,参数1为图形窗口名称,参数2表清除所有信号
app.ui_graphics_clear_signals("Graphics", -1);//删除用户系统变量,参数1为系统变量的完整名称
app.delete_system_var("var1");

2、数据库类


s32 n;
//获取所有加载的CAN数据库数量
app.db_get_can_database_count(&n)
log("loaded database count = %d", n);TDBProperties db;
//通过索引获取指定CAN数据库的属性(哪个数据库)
db.FDBIndex = i; //调用前先指定索引
app.db_get_can_database_properties_by_index(&db)TDBECUProperties ecu;
ecu.FDBIndex = i;
ecu.FECUIndex = j;
app.db_get_can_ecu_properties_by_index(&ecu) //获取ECU节点的属性TDBFrameProperties msg;
msg.FDBIndex = i;
msg.FECUIndex = j;
msg.FFrameIndex = k;
msg.FIsTx = 1;
app.db_get_can_frame_properties_by_index(&msg) //获取报文帧的属性TDBSignalProperties sgn;
sgn.FDBIndex = i;
sgn.FECUIndex = j;
sgn.FFrameIndex = k;
sgn.FSignalIndex = m;
sgn.FIsTx = msg.FIsTx;
app.db_get_can_signal_properties_by_index(&sgn) //获取信号的属性

五、TAC脚本

1、TAC数据库和报文信号的读写

2、TAC系统变量的直接读写

六、代码生成

1、图形程序自动生成(流程图测试流程)

s32 idx;
s64 mid, eid, eid1, eid2, aid, aid1, aid2, aid3, aid4, aid5, gid1, gid2, fid, jid1, jid2, jid3;
TLIBAutomationSignalType typWait[2] = {lastImmediateValue, lastImmediateValue};
char* argNameWait[2] = {"ATimeMs", "ADescription"};
char* argValueWait[2] = {"3000", "auto wait 3s"};
TLIBAutomationSignalType typExpr[2] = {lastSysVar, lastLocalVar};
char* argValueExpr[2] = {"Application.Connected", "local1"};
/*O|a1    -     a3    -     g2    -     Jump Right ->|          |           |NOP      Jump Down   a4 (Expression)|                      |
a5 (From) <-            j3 (Jump Left)|a2 |        g1 
*/
// add
app.check(app.gpg_delete_all_modules());
app.check(app.gpg_create_module("DemoProgram", "Auto created demo program", &mid, &eid));
app.check(app.gpg_add_local_var(mid, lvtInteger, "local1", "123", "auto added local var", &idx));
app.check(app.gpg_add_local_var(mid, lvtDouble, "local2", "456", "auto added local var", &idx));
app.check(app.gpg_add_action_down(mid, eid, "NOP Action 1", "this is an auto created NOP1", &aid1));
app.check(app.gpg_add_action_down(mid, aid1, "NOP Action 2", "this is an auto created NOP2", &aid2));
app.check(app.gpg_add_action_right(mid, aid1, "NOP Action 3", "this is an auto created NOP3", &aid3));
app.check(app.gpg_add_goto_down(mid, aid3, "Jump Down", "jump down action", "jmplbl", &jid1));
app.check(app.gpg_add_group_right(mid, aid3, "Group Right", "action group", &gid2, &eid2));
app.check(app.gpg_add_action_down(mid, gid2, "Expression", "this is an auto created expression", &aid4));
app.check(app.gpg_add_goto_down(mid, aid4, "Goto Left", "go to the first execution line", "lbl", &jid3));
app.check(app.gpg_add_goto_right(mid, gid2, "Jump Right", "jump right action", "lbl", &jid2));
app.check(app.gpg_add_action_down(mid, aid1, "Not Executed", "this may not be executed", &aid));
app.check(app.gpg_add_from_down(mid, aid, "Jump From", "jump from action", "lbl", &aid5));
app.check(app.gpg_add_group_down(mid, aid2, "Group Down", "action group", &gid1, &eid1));
app.check(app.gpg_add_action_down(mid, eid, "NOP Delete", "this will be deleted", &aid));
app.check(app.gpg_delete_action(mid, aid));
app.check(app.gpg_add_action_down(mid, eid1, "set local2 = 88", "this is an action in group", &aid));
// configure
app.check(app.gpg_configure_goto(mid, jid1, "Go Down", "go down action", "lbl"));
app.check(app.gpg_set_action_nop(mid, aid1));
app.check(app.gpg_set_action_signal_read_write(mid, aid1));
app.check(app.gpg_configure_signal_read_write_list_clear(mid, aid1));
app.check(app.gpg_configure_signal_read_list_append(mid, aid1, true, lastLocalVar, lastImmediateValue, lastImmediateValue, "local2", "1", "100", &idx));
app.check(app.gpg_configure_signal_read_list_append(mid, aid1, true, lastLocalVar, lastImmediateValue, lastImmediateValue, "local1", "1", "100", &idx));
app.check(app.gpg_configure_signal_read_write_list_delete(mid, aid1, 0));
app.check(app.gpg_set_action_api_call(mid, aid2));
app.check(app.gpg_configure_action_basic(mid, aid1, "Judgement", "this is a judgement", 3000));
app.check(app.gpg_configure_action_basic(mid, aid2, "API Call", "this is an api call", 1000));
app.check(app.gpg_configure_nop(mid, aid3, false, true, false));
app.check(app.gpg_configure_api_call_arguments(mid, aid2, lmfsSystemFunc, "app.wait", &typWait[0], &argNameWait[0], &argValueWait[0], 2));
app.check(app.gpg_configure_api_call_result(mid, aid2, false, lastLocalVar, "local1"));
app.check(app.gpg_set_action_expression(mid, aid4));
app.check(app.gpg_configure_expression(mid, aid4, 2, "(x1 + 2) * (x2 + 6)", &typExpr[0], &argValueExpr[0], lastLocalVar, "local1"));
app.check(app.gpg_configure_group(mid, gid1, lastLocalVar, "local1"));
app.check(app.gpg_set_action_signal_read_write(mid, aid));
app.check(app.gpg_configure_signal_write_list_append(mid, aid, lastLocalVar, lastImmediateValue, "local2", "88.8", &idx));app.check(app.gpg_deploy_module(mid, "New Graphic Program"));
app.terminate_application();

(1)流程图相关的函数

//1.检查函数返回值是否正确,如果不正确,将打印错误信息。如果返回值不为0,则结果正常。
app.check()  //参数为函数返回的值//2.删除图形程序生成器中的所有模块
app.gpg_delete_all_modules()//3.在图形程序生成器中创建模块。程序名称,程序显示的名称,自动创建的模块id,自动创建的入口id
app.gpg_create_module("DemoProgram", "Auto created demo program", &mid, &eid)//4.在gpg的模块中添加局部变量。模块id,局部变量类型,局部变量名,字符串中的局部变量初始值,局部变量注释,列表中局部变量项索引
app.gpg_add_local_var(mid, lvtInteger, "local1", "123", "auto added local var", &idx)//5.在gpg中向下,向右添加一个步骤。
app.gpg_add_action_down(mid, eid, "NOP Action 1", "this is an auto created NOP1", &aid1)app.gpg_add_action_right(mid, aid1, "NOP Action 3", "this is an auto created NOP3", &aid3)//6.在gpg中向下,向右添加一个goto步骤
app.gpg_add_goto_down(mid, aid3, "Jump Down", "jump down action", "jmplbl", &jid1)
app.gpg_add_goto_right(mid, gid2, "Jump Right", "jump right action", "lbl", &jid2)//7.在gpg中向右添加一个group步骤
app.gpg_add_group_right(mid, aid3, "Group Right", "action group", &gid2, &eid2)//8.在gpg中向下添加一个from步骤
app.gpg_add_from_down(mid, aid, "Jump From", "jump from action", "lbl", &aid5)//9.在图形程序生成器中设置goto的步骤类型
app.gpg_configure_goto(mid, jid1, "Go Down", "go down action", "lbl")//10.在图形程序生成器中将步骤类型设置为nop
app.gpg_set_action_nop(mid, aid1)//11.在图形程序生成器中将类型步骤设置为信号读写
app.gpg_set_action_signal_read_write(mid, aid1)//12.清除图形程序生成器中动作的信号读写列表
app.gpg_configure_signal_read_write_list_clear(mid, aid1)//13.在图形程序生成器中动作的读取和比较列表中添加新信号
app.gpg_configure_signal_read_list_append(mid, aid1, true, lastLocalVar, lastImmediateValue, lastImmediateValue, "local2", "1", "100", &idx)//14.删除图形程序生成器中一个步骤的信号读写列表中的特定项目
app.gpg_configure_signal_read_write_list_delete(mid, aid1, 0)//15.在图形程序生成器中将action类型设置为API调用
app.gpg_set_action_api_call(mid, aid2)//16.在图形程序生成器中将步骤类型设置为表达式
app.gpg_configure_action_basic(mid, aid1, "Judgement", "this is a judgement", 3000)//等等...........................

七、系统变量曲线绘制

1、在图形中绘制系统变量

//1.获取当前测量的PC时间戳
s64 t0;
app.get_timestamp(&t0);//2.设置系统变量
app.set_system_var_double("y", y);

http://www.dtcms.com/a/554093.html

相关文章:

  • 伯位数智模式为商家经营带来的变革与机遇
  • 网盘怎么做电影网站网站在公司做有什么要求吗
  • 介绍一下 multiprocessing 的 Manager模块
  • 网页建站总结报告网站建设初期怎么添加内容
  • C语言——猜数字游戏(rand、srand、time函数学习)
  • 多媒体网站开发实战装修设计软件免费
  • Rust流程控制(下):loop、while、for循环
  • 使用 UV 工具管理 Python 项目的常用命令
  • 解析视频汇聚平台EasyCVR强大的设备统一管理能力,助力构筑安防融合感知的基石
  • 南通做网站的手机怎么看网页源代码
  • 温州网上推广什么网站好深圳网络推广团队
  • 1951-2024年我国逐日\逐月\逐年近地面气温栅格数据
  • Linux----进程控制
  • 公司网站建设公司微网站建设价格
  • AI代码开发宝库系列:RAG--GraphRAG实战
  • 做一份网站动态图多少钱免费ip地址
  • 基于空间螺旋运动假设的水星近日点进动理论推导与验证
  • 手写Spring第20弹:JDK动态代理:深入剖析Java代理模式
  • 京网站建设公司行业app开发公司
  • 平面设计网站导航dw软件代码大全
  • PyTorch生成式人工智能——MUNIT详解与实现
  • 建设微网站网站公司介绍模板
  • 网站为什么做微云的采集备案网站首页地址
  • [linux] rm命令
  • HTML加密工具EXE软件介绍
  • 大模型微调怎么实现?当然不是人工对一些参数微小调整!
  • TRAE SOLO:基于React 18+与蓝耘MaaS的多语言智能翻译平台设计与实现
  • 做网站编辑需要会什么深圳网络推广平台
  • 深入解析 MybatisPlus 中实现一对多查询的方法:以食谱餐别与菜单详情为例
  • 网站为什么不被收录做c2c网站的弊端