mb_master.c
changeset 1 59783e8ee3d2
parent 0 ae252e0fd9b8
equal deleted inserted replaced
0:ae252e0fd9b8 1:59783e8ee3d2
   372 
   372 
   373 
   373 
   374 /* FUNCTION 0x01   - Read Coils
   374 /* FUNCTION 0x01   - Read Coils
   375  * Bits are stored on an int array, one bit per int.
   375  * Bits are stored on an int array, one bit per int.
   376  */
   376  */
   377 inline int read_output_bits(u8  slave,
   377 int read_output_bits(u8  slave,
   378                             u16 start_addr,
   378                      u16 start_addr,
   379                             u16 count,
   379                      u16 count,
   380                             u16 *dest,
   380                      u16 *dest,
   381                             int dest_size,
   381                      int dest_size,
   382                             int ttyfd,
   382                      int ttyfd,
   383                             int send_retries,
   383                      int send_retries,
   384                             u8  *error_code,
   384                      u8  *error_code,
   385                             const struct timespec *response_timeout,
   385                      const struct timespec *response_timeout,
   386                             pthread_mutex_t *data_access_mutex) {
   386                      pthread_mutex_t *data_access_mutex) {
   387   if( count > MAX_READ_BITS ) {
   387   if( count > MAX_READ_BITS ) {
   388     count = MAX_READ_BITS;
   388     count = MAX_READ_BITS;
   389     #ifdef DEBUG
   389     #ifdef DEBUG
   390     fprintf( stderr, "Too many coils requested.\n" );
   390     fprintf( stderr, "Too many coils requested.\n" );
   391     #endif
   391     #endif
   400 
   400 
   401 /* FUNCTION 0x01   - Read Coils
   401 /* FUNCTION 0x01   - Read Coils
   402  * Bits are stored on an u32 array, 32 bits per u32.
   402  * Bits are stored on an u32 array, 32 bits per u32.
   403  * Unused bits in last u32 are set to 0.
   403  * Unused bits in last u32 are set to 0.
   404  */
   404  */
   405 inline int read_output_bits_u32(u8  slave,
   405 int read_output_bits_u32(u8  slave,
   406                                 u16 start_addr,
   406                          u16 start_addr,
   407                                 u16 count,
   407                          u16 count,
   408                                 u32 *dest,
   408                          u32 *dest,
   409                                 int ttyfd,
   409                          int ttyfd,
   410                                 int send_retries,
   410                          int send_retries,
   411                                 u8  *error_code,
   411                          u8  *error_code,
   412                                 const struct timespec *response_timeout) {
   412                          const struct timespec *response_timeout) {
   413   if( count > MAX_READ_BITS ) {
   413   if( count > MAX_READ_BITS ) {
   414     count = MAX_READ_BITS;
   414     count = MAX_READ_BITS;
   415     #ifdef DEBUG
   415     #ifdef DEBUG
   416     fprintf( stderr, "Too many coils requested.\n" );
   416     fprintf( stderr, "Too many coils requested.\n" );
   417     #endif
   417     #endif
   424 
   424 
   425 
   425 
   426 /* FUNCTION 0x02   - Read Discrete Inputs
   426 /* FUNCTION 0x02   - Read Discrete Inputs
   427  * Bits are stored on an int array, one bit per int.
   427  * Bits are stored on an int array, one bit per int.
   428  */
   428  */
   429 inline int read_input_bits(u8  slave,
   429 int read_input_bits(u8  slave,
   430                            u16 start_addr,
   430                     u16 start_addr,
   431                            u16 count,
   431                     u16 count,
   432                            u16 *dest,
   432                     u16 *dest,
   433                            int dest_size,
   433                     int dest_size,
   434                            int ttyfd,
   434                     int ttyfd,
   435                            int send_retries,
   435                     int send_retries,
   436                            u8  *error_code,
   436                     u8  *error_code,
   437                            const struct timespec *response_timeout,
   437                     const struct timespec *response_timeout,
   438                            pthread_mutex_t *data_access_mutex) {
   438                     pthread_mutex_t *data_access_mutex) {
   439   if( count > MAX_READ_BITS ) {
   439   if( count > MAX_READ_BITS ) {
   440     count = MAX_READ_BITS;
   440     count = MAX_READ_BITS;
   441     #ifdef DEBUG
   441     #ifdef DEBUG
   442     fprintf( stderr, "Too many coils requested.\n" );
   442     fprintf( stderr, "Too many coils requested.\n" );
   443     #endif
   443     #endif
   452 
   452 
   453 /* FUNCTION 0x02   - Read Discrete Inputs
   453 /* FUNCTION 0x02   - Read Discrete Inputs
   454  * Bits are stored on an u32 array, 32 bits per u32.
   454  * Bits are stored on an u32 array, 32 bits per u32.
   455  * Unused bits in last u32 are set to 0.
   455  * Unused bits in last u32 are set to 0.
   456  */
   456  */
   457 inline int read_input_bits_u32(u8  slave,
   457 int read_input_bits_u32(u8  slave,
   458                                u16 start_addr,
   458                         u16 start_addr,
   459                                u16 count,
   459                         u16 count,
   460                                u32 *dest,
   460                         u32 *dest,
   461                                int ttyfd,
   461                         int ttyfd,
   462                                int send_retries,
   462                         int send_retries,
   463                                u8  *error_code,
   463                         u8  *error_code,
   464                                const struct timespec *response_timeout) {
   464                         const struct timespec *response_timeout) {
   465   if( count > MAX_READ_BITS ) {
   465   if( count > MAX_READ_BITS ) {
   466     count = MAX_READ_BITS;
   466     count = MAX_READ_BITS;
   467     #ifdef DEBUG
   467     #ifdef DEBUG
   468     fprintf( stderr, "Too many coils requested.\n" );
   468     fprintf( stderr, "Too many coils requested.\n" );
   469     #endif
   469     #endif
   655 
   655 
   656 
   656 
   657 
   657 
   658 
   658 
   659 /* FUNCTION 0x03   - Read Holding Registers */
   659 /* FUNCTION 0x03   - Read Holding Registers */
   660 inline int read_output_words(u8  slave,
   660 int read_output_words(u8  slave,
       
   661                       u16 start_addr,
       
   662                       u16 count,
       
   663                       u16 *dest,
       
   664                       int dest_size,
       
   665                       int ttyfd,
       
   666                       int send_retries,
       
   667                       u8  *error_code,
       
   668                       const struct timespec *response_timeout,
       
   669                       pthread_mutex_t *data_access_mutex) {
       
   670   if( count > MAX_READ_REGS ) {
       
   671     count = MAX_READ_REGS;
       
   672     #ifdef DEBUG
       
   673     fprintf( stderr, "Too many registers requested.\n" );
       
   674     #endif
       
   675   }
       
   676 
       
   677   return read_registers(0x03 /* function */,
       
   678                         slave, start_addr, count, dest, dest_size, ttyfd,
       
   679                         send_retries, error_code, response_timeout, data_access_mutex);
       
   680 }
       
   681 
       
   682 
       
   683 
       
   684 
       
   685 /* FUNCTION 0x03   - Read Holding Registers
       
   686  * u16 registers are stored in array of u32, two registers per u32.
       
   687  * Unused bits of last u32 element are set to 0.
       
   688  */
       
   689 int read_output_words_u32(u8  slave,
       
   690                           u16 start_addr,
       
   691                           u16 count,
       
   692                           u32 *dest,
       
   693                           int ttyfd,
       
   694                           int send_retries,
       
   695                           u8  *error_code,
       
   696                           const struct timespec *response_timeout) {
       
   697   if( count > MAX_READ_REGS ) {
       
   698     count = MAX_READ_REGS;
       
   699     #ifdef DEBUG
       
   700     fprintf( stderr, "Too many registers requested.\n" );
       
   701     #endif
       
   702   }
       
   703   
       
   704   return read_registers_u32(0x03 /* function */,
       
   705                             slave, start_addr, count, dest, ttyfd,
       
   706                             send_retries, error_code, response_timeout);
       
   707 }
       
   708 
       
   709 
       
   710 
       
   711 
       
   712 /* FUNCTION 0x03   - Read Holding Registers
       
   713  * return the array with the data to the calling function
       
   714  */
       
   715 int read_output_words_u16_ref(u8  slave,
       
   716                               u16 start_addr,
       
   717                               u16 count,
       
   718                               u16 **dest,
       
   719                               int ttyfd,
       
   720                               int send_retries,
       
   721                               u8  *error_code,
       
   722                               const struct timespec *response_timeout) {
       
   723   if( count > MAX_READ_REGS ) {
       
   724     count = MAX_READ_REGS;
       
   725     #ifdef DEBUG
       
   726     fprintf( stderr, "Too many registers requested.\n" );
       
   727     #endif
       
   728   }
       
   729   
       
   730   return read_registers_u16_ref(0x03 /* function */,
       
   731                                 slave, start_addr, count, dest, ttyfd, send_retries,
       
   732                                 error_code, response_timeout);
       
   733 }
       
   734 
       
   735 
       
   736 
       
   737 
       
   738 /* FUNCTION 0x04   - Read Input Registers */
       
   739 int read_input_words(u8  slave,
       
   740                      u16 start_addr,
       
   741                      u16 count,
       
   742                      u16 *dest,
       
   743                      int dest_size,
       
   744                      int ttyfd,
       
   745                      int send_retries,
       
   746                      u8  *error_code,
       
   747                      const struct timespec *response_timeout,
       
   748                      pthread_mutex_t *data_access_mutex) {
       
   749   if( count > MAX_READ_REGS ) {
       
   750     count = MAX_READ_REGS;
       
   751     #ifdef DEBUG
       
   752     fprintf( stderr, "Too many input registers requested.\n" );
       
   753     #endif
       
   754   }
       
   755   
       
   756   return read_registers(0x04 /* function */,
       
   757                         slave, start_addr, count, dest, dest_size, ttyfd, send_retries,
       
   758                         error_code, response_timeout, data_access_mutex);
       
   759 }
       
   760 
       
   761 
       
   762 /* FUNCTION 0x04   - Read Input Registers
       
   763  * u16 registers are stored in array of u32, two registers per u32.
       
   764  * Unused bits of last u32 element are set to 0.
       
   765  */
       
   766 int read_input_words_u32(u8  slave,
       
   767                          u16 start_addr,
       
   768                          u16 count,
       
   769                          u32 *dest,
       
   770                          int ttyfd,
       
   771                          int send_retries,
       
   772                          u8  *error_code,
       
   773                          const struct timespec *response_timeout) {
       
   774   if( count > MAX_READ_REGS ) {
       
   775     count = MAX_READ_REGS;
       
   776     #ifdef DEBUG
       
   777     fprintf( stderr, "Too many input registers requested.\n" );
       
   778     #endif
       
   779   }
       
   780   
       
   781   return read_registers_u32(0x04 /* function */,
       
   782                             slave, start_addr, count, dest, ttyfd, send_retries,
       
   783                             error_code, response_timeout);
       
   784 }
       
   785 
       
   786 
       
   787 
       
   788 
       
   789 /* FUNCTION 0x04   - Read Input Registers
       
   790  * return the array with the data to the calling function
       
   791  */
       
   792 int read_input_words_u16_ref(u8  slave,
   661                              u16 start_addr,
   793                              u16 start_addr,
   662                              u16 count,
   794                              u16 count,
   663                              u16 *dest,
   795                              u16 **dest,
   664                              int dest_size,
       
   665                              int ttyfd,
   796                              int ttyfd,
   666                              int send_retries,
   797                              int send_retries,
   667                              u8  *error_code,
   798                              u8  *error_code,
   668                              const struct timespec *response_timeout,
   799                              const struct timespec *response_timeout) {
   669                              pthread_mutex_t *data_access_mutex) {
       
   670   if( count > MAX_READ_REGS ) {
       
   671     count = MAX_READ_REGS;
       
   672     #ifdef DEBUG
       
   673     fprintf( stderr, "Too many registers requested.\n" );
       
   674     #endif
       
   675   }
       
   676 
       
   677   return read_registers(0x03 /* function */,
       
   678                         slave, start_addr, count, dest, dest_size, ttyfd,
       
   679                         send_retries, error_code, response_timeout, data_access_mutex);
       
   680 }
       
   681 
       
   682 
       
   683 
       
   684 
       
   685 /* FUNCTION 0x03   - Read Holding Registers
       
   686  * u16 registers are stored in array of u32, two registers per u32.
       
   687  * Unused bits of last u32 element are set to 0.
       
   688  */
       
   689 inline int read_output_words_u32(u8  slave,
       
   690                                  u16 start_addr,
       
   691                                  u16 count,
       
   692                                  u32 *dest,
       
   693                                  int ttyfd,
       
   694                                  int send_retries,
       
   695                                  u8  *error_code,
       
   696                                  const struct timespec *response_timeout) {
       
   697   if( count > MAX_READ_REGS ) {
       
   698     count = MAX_READ_REGS;
       
   699     #ifdef DEBUG
       
   700     fprintf( stderr, "Too many registers requested.\n" );
       
   701     #endif
       
   702   }
       
   703   
       
   704   return read_registers_u32(0x03 /* function */,
       
   705                             slave, start_addr, count, dest, ttyfd,
       
   706                             send_retries, error_code, response_timeout);
       
   707 }
       
   708 
       
   709 
       
   710 
       
   711 
       
   712 /* FUNCTION 0x03   - Read Holding Registers
       
   713  * return the array with the data to the calling function
       
   714  */
       
   715 inline int read_output_words_u16_ref(u8  slave,
       
   716                                      u16 start_addr,
       
   717                                      u16 count,
       
   718                                      u16 **dest,
       
   719                                      int ttyfd,
       
   720                                      int send_retries,
       
   721                                      u8  *error_code,
       
   722                                      const struct timespec *response_timeout) {
       
   723   if( count > MAX_READ_REGS ) {
       
   724     count = MAX_READ_REGS;
       
   725     #ifdef DEBUG
       
   726     fprintf( stderr, "Too many registers requested.\n" );
       
   727     #endif
       
   728   }
       
   729   
       
   730   return read_registers_u16_ref(0x03 /* function */,
       
   731                                 slave, start_addr, count, dest, ttyfd, send_retries,
       
   732                                 error_code, response_timeout);
       
   733 }
       
   734 
       
   735 
       
   736 
       
   737 
       
   738 /* FUNCTION 0x04   - Read Input Registers */
       
   739 inline int read_input_words(u8  slave,
       
   740                             u16 start_addr,
       
   741                             u16 count,
       
   742                             u16 *dest,
       
   743                             int dest_size,
       
   744                             int ttyfd,
       
   745                             int send_retries,
       
   746                             u8  *error_code,
       
   747                             const struct timespec *response_timeout,
       
   748                             pthread_mutex_t *data_access_mutex) {
       
   749   if( count > MAX_READ_REGS ) {
       
   750     count = MAX_READ_REGS;
       
   751     #ifdef DEBUG
       
   752     fprintf( stderr, "Too many input registers requested.\n" );
       
   753     #endif
       
   754   }
       
   755   
       
   756   return read_registers(0x04 /* function */,
       
   757                         slave, start_addr, count, dest, dest_size, ttyfd, send_retries,
       
   758                         error_code, response_timeout, data_access_mutex);
       
   759 }
       
   760 
       
   761 
       
   762 /* FUNCTION 0x04   - Read Input Registers
       
   763  * u16 registers are stored in array of u32, two registers per u32.
       
   764  * Unused bits of last u32 element are set to 0.
       
   765  */
       
   766 inline int read_input_words_u32(u8  slave,
       
   767                                 u16 start_addr,
       
   768                                 u16 count,
       
   769                                 u32 *dest,
       
   770                                 int ttyfd,
       
   771                                 int send_retries,
       
   772                                 u8  *error_code,
       
   773                                 const struct timespec *response_timeout) {
       
   774   if( count > MAX_READ_REGS ) {
       
   775     count = MAX_READ_REGS;
       
   776     #ifdef DEBUG
       
   777     fprintf( stderr, "Too many input registers requested.\n" );
       
   778     #endif
       
   779   }
       
   780   
       
   781   return read_registers_u32(0x04 /* function */,
       
   782                             slave, start_addr, count, dest, ttyfd, send_retries,
       
   783                             error_code, response_timeout);
       
   784 }
       
   785 
       
   786 
       
   787 
       
   788 
       
   789 /* FUNCTION 0x04   - Read Input Registers
       
   790  * return the array with the data to the calling function
       
   791  */
       
   792 inline int read_input_words_u16_ref(u8  slave,
       
   793                                     u16 start_addr,
       
   794                                     u16 count,
       
   795                                     u16 **dest,
       
   796                                     int ttyfd,
       
   797                                     int send_retries,
       
   798                                     u8  *error_code,
       
   799                                     const struct timespec *response_timeout) {
       
   800   if( count > MAX_READ_REGS ) {
   800   if( count > MAX_READ_REGS ) {
   801     count = MAX_READ_REGS;
   801     count = MAX_READ_REGS;
   802     #ifdef DEBUG
   802     #ifdef DEBUG
   803     fprintf( stderr, "Too many input registers requested.\n" );
   803     fprintf( stderr, "Too many input registers requested.\n" );
   804     #endif
   804     #endif
   850 
   850 
   851 
   851 
   852 
   852 
   853 
   853 
   854 /* FUNCTION 0x05   - Force Single Coil */
   854 /* FUNCTION 0x05   - Force Single Coil */
   855 inline int write_output_bit(u8  slave,
   855 int write_output_bit(u8  slave,
   856                             u16 coil_addr,
   856                      u16 coil_addr,
   857                             u16 state,
   857                      u16 state,
   858                             int fd,
   858                      int fd,
   859                             int send_retries,
   859                      int send_retries,
   860                             u8  *error_code,
   860                      u8  *error_code,
   861                             const struct timespec *response_timeout,
   861                      const struct timespec *response_timeout,
   862                             pthread_mutex_t *data_access_mutex) {
   862                      pthread_mutex_t *data_access_mutex) {
   863   if (state) state = 0xFF00;
   863   if (state) state = 0xFF00;
   864   
   864   
   865   return set_single(0x05 /* function */,
   865   return set_single(0x05 /* function */,
   866                     slave, coil_addr, state, fd, send_retries,
   866                     slave, coil_addr, state, fd, send_retries,
   867                     error_code, response_timeout, data_access_mutex);
   867                     error_code, response_timeout, data_access_mutex);
   870 
   870 
   871 
   871 
   872 
   872 
   873 
   873 
   874 /* FUNCTION 0x06   - Write Single Register */
   874 /* FUNCTION 0x06   - Write Single Register */
   875 inline int write_output_word(u8  slave,
   875 int write_output_word(u8  slave,
   876                              u16 reg_addr,
   876                       u16 reg_addr,
   877                              u16 value,
   877                       u16 value,
   878                              int fd,
   878                       int fd,
   879                              int send_retries,
   879                       int send_retries,
   880                              u8  *error_code,
   880                       u8  *error_code,
   881                              const struct timespec *response_timeout,
   881                       const struct timespec *response_timeout,
   882                              pthread_mutex_t *data_access_mutex) {
   882                       pthread_mutex_t *data_access_mutex) {
   883   return set_single(0x06 /* function */, 
   883   return set_single(0x06 /* function */, 
   884                     slave, reg_addr, value, fd, send_retries,
   884                     slave, reg_addr, value, fd, send_retries,
   885                     error_code, response_timeout, data_access_mutex);
   885                     error_code, response_timeout, data_access_mutex);
   886 }
   886 }
   887 
   887