📄 mbus_cmd.c
字号:
return 0;}/* * MODBUS command - Function Code 03 (Read Holding Registers) * * Returns: 1 if exception code returned, * 0 if response received successfully, * -1 in case of error. */intmbus_cmd_read_holding_registers( mbus_struct *mbus, /* Pointer to MBUS structure */ mbus_ubyte slave_addr, /* MODBUS device address (1-247) */ mbus_uword start_addr, /* Starting register address (0-65535) */ mbus_uword points_num, /* Quantity of registers to read (1-65535) */ mbus_uword *data /* Pointer to readed data buffer */){ int rc; mbus_ubyte *bufptr = mbus->buf + MBUS_DATA, data_count; mbus_uword word_buf; MBUS_CHECK_ADDR(slave_addr, 1); /* make request */ if ((rc = mbus_cmd_addr_wdata(mbus, slave_addr, MBUS_FC_READHOLDINGREGISTERS, start_addr, points_num)) != 0) return rc; /* take bytecount divided by 2 */ data_count = MBUS_BYTE_RD(bufptr) / 2; if (!data_count) return -1; /* invalid value of bytecount */ /* copy received data */ while (data_count--) { MBUS_WORD_RD(bufptr, word_buf); *data++ = word_buf; } return 0;}/* * MODBUS command - Function Code 05 (Force Single Coil) * * Returns: 1 if exception code returned, * 0 if response received successfully, * -1 in case of error. */intmbus_cmd_force_single_coil( mbus_struct *mbus, /* Pointer to MBUS structure */ mbus_ubyte slave_addr, /* MODBUS device address (0-247) */ mbus_uword coil_addr, /* Coil address (0-65535) */ mbus_uword data /* Force data */){ int rc; mbus_uword resp_data; mbus_ubyte *bufptr = mbus->buf + MBUS_DATA; MBUS_CHECK_ADDR(slave_addr, 0); /* make request */ if((rc = mbus_cmd_addr_wdata(mbus, slave_addr, MBUS_FC_FORCESINGLECOIL, coil_addr, data)) != 0) return rc; /* check response coil address */ MBUS_WORD_RD(bufptr, resp_data); if (resp_data!= coil_addr) return -1; /* coil_address is incorrect */ /* check response data */ MBUS_WORD_RD(bufptr, resp_data); return (resp_data == data) ? 0 : -1;}/* * MODBUS command - Function Code 06 (Preset Single Register) * * Returns: 1 if exception code returned, * 0 if response received successfully, * -1 in case of error. */intmbus_cmd_preset_single_register( mbus_struct *mbus, /* Pointer to MBUS structure */ mbus_ubyte slave_addr, /* MODBUS device address (0-247) */ mbus_uword register_addr, /* Starting register address (0-65535) */ mbus_uword preset_data /* Register preset data (0-65535) */){ int rc; mbus_uword resp_data; mbus_ubyte *bufptr = mbus->buf + MBUS_DATA; MBUS_CHECK_ADDR(slave_addr, 0); /* make request */ if((rc = mbus_cmd_addr_wdata(mbus, slave_addr, MBUS_FC_PRESETSINGLEREGISTER, register_addr, preset_data)) != 0) return rc; /* check response register address */ MBUS_WORD_RD(bufptr, resp_data); if (resp_data!= register_addr) return -1; /* register address is incorrect */ /* check response data */ MBUS_WORD_RD(bufptr, resp_data); return (resp_data == preset_data) ? 0 : -1;}/* * MODBUS command - Function Code 08 (Diagnostics) * * Returns: 1 if exception code returned, * 0 if response received successfully, * -1 in case of error. */intmbus_cmd_diagnostics( mbus_struct *mbus, /* Pointer to MBUS structure */ mbus_ubyte slave_addr, /* MODBUS device address (1-247) */ mbus_uword subfunction, /* Subfunction code (0-65535) */ mbus_uword *data /* Pointer to the query data (replaced by response data in case of success) */){ int rc; mbus_uword resp_subfunction; mbus_ubyte *bufptr = mbus->buf + MBUS_DATA; MBUS_CHECK_ADDR(slave_addr, 1); /* make request */ if((rc = mbus_cmd_addr_wdata(mbus, slave_addr, MBUS_FC_DIAGNOSTICS, subfunction, *data)) != 0) return rc; /* check response subfunction code */ MBUS_WORD_RD(bufptr, resp_subfunction); if (resp_subfunction != subfunction) return -1; /* subfunction code is incorrect */ /* read response data */ MBUS_WORD_RD(bufptr, *data); return 0;}/* * MODBUS command - Function Code 15 (Force Multiple Coils) * * Returns: 1 if exception code returned, * 0 if response received successfully, * -1 in case of error. */intmbus_cmd_force_multiple_coils( mbus_struct *mbus, /* Pointer to MBUS structure */ mbus_ubyte slave_addr, /* MODBUS device address (0-247) */ mbus_uword coils_addr, /* Coils address (0-65535) */ mbus_uword coils_num, /* Number of coils to force (0-65535) */ mbus_ubyte *coils_data /* Pointer to coils force data */){ int rc; mbus_uword resp_data; mbus_ubyte *bufptr = mbus->buf + MBUS_DATA; MBUS_CHECK_ADDR(slave_addr, 0); /* make request */ if((rc = mbus_cmd_addr_mdata(mbus, slave_addr, MBUS_FC_FORCEMULTIPLECOILS, coils_addr, coils_data, 0, coils_num)) != 0) return rc; /* check response coil address */ MBUS_WORD_RD(bufptr, resp_data); if (resp_data!= coils_addr) return -1; /* coil_address is incorrect */ /* check response quantity */ MBUS_WORD_RD(bufptr, resp_data); return (resp_data == coils_num) ? 0 : -1;}/* * MODBUS command - Function Code 16 (Preset Multiple Registers) * * Returns: 1 if exception code returned, * 0 if response received successfully, * -1 in case of error. */intmbus_cmd_preset_multiple_registers( mbus_struct *mbus, /* Pointer to MBUS structure */ mbus_ubyte slave_addr, /* MODBUS device address (0-247) */ mbus_uword start_addr, /* Registers starting address (0-65535) */ mbus_uword points_num, /* Number of registers to preset (0-65535) */ mbus_uword *data /* Pointer to registers preset data */){ int rc; mbus_uword resp_data; mbus_ubyte *bufptr = mbus->buf + MBUS_DATA; MBUS_CHECK_ADDR(slave_addr, 0); /* make request */ if((rc = mbus_cmd_addr_mdata(mbus, slave_addr, MBUS_FC_PRESETMULTIPLEREGISTERS, start_addr, (mbus_ubyte *)data, 1, points_num)) != 0) return rc; /* check response registers starting address */ MBUS_WORD_RD(bufptr, resp_data); if (resp_data != start_addr) return -1; /* registers address is incorrect */ /* check response quantity */ MBUS_WORD_RD(bufptr, resp_data); return (resp_data == points_num) ? 0 : -1;}/* * MODBUS command - Function Code 17 (Report Slave ID) * Returns: 1 if exception code returned, * 0 if response received successfully, * -1 in case of error. */intmbus_cmd_report_slave_id( mbus_struct *mbus, /* Pointer to MBUS structure */ mbus_ubyte slave_addr, /* MODBUS device address (1-247) */ mbus_ubyte *data_count, /* Readed slave ID data count */ mbus_ubyte *slave_data /* Pointer to readed slave ID data buffer */){ int rc; mbus_ubyte byte_count; mbus_ubyte *bufptr = mbus->buf + MBUS_DATA; MBUS_CHECK_ADDR(slave_addr, 1); /* make request */ if((rc = mbus_cmd_nodata(mbus, slave_addr, MBUS_FC_REPORTSLAVEID)) != 0) return rc; /* take bytecount */ byte_count = MBUS_BYTE_RD(bufptr); *data_count = byte_count; if (!byte_count) return -1; /* invalid value of bytecount */ /* copy received data */ while (byte_count--) MBUS_BYTE_WR(slave_data, *bufptr++); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -