⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbus_cmd.c

📁 OpenMODBUS/TCP to RS-232/485 MODBUS RTU gateway librar Zhejiang Univ. Hangzhou, China Dec.2006
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -