22 if(max_telegram_length < 256) max_telegram_length = 256;
23 tel =
new unsigned char[max_telegram_length];
24 maxtel = max_telegram_length;
34 if(
tel != NULL)
delete []
tel;
39 return (data[0]*256)+data[1];
44 data[0] = (
unsigned char) val / 256;
45 data[1] = (
unsigned char) val & 0x0ff;
54 int rlModbus::write(
int slave,
int function,
const unsigned char *data,
int datalen,
int *transactionID)
63 sprintf((
char *) &
tel[len],
"%02X", slave); len += 2;
64 sprintf((
char *) &
tel[len],
"%02X",
function); len += 2;
65 for(i=0; i<datalen; i++)
67 sprintf((
char *) &
tel[len],
"%02X",(
int) data[i]); len += 2;
78 if(transactionID == NULL)
85 tel[len++] = ((*transactionID) & 0xFF00) / 256;
86 tel[len++] = (*transactionID) & 0xFF;
91 tel[len++] = 2+datalen;
93 tel[len++] = (
unsigned char) slave;
94 tel[len++] = (
unsigned char)
function;
95 for(i=0; i<datalen; i++)
123 unsigned char data[4];
125 data[0] = (
unsigned char) ( start_adr / 256 );
126 data[1] = (
unsigned char) ( start_adr & 0x0ff );
127 data[2] = (
unsigned char) ( num_register / 256 );
128 data[3] = (
unsigned char) ( num_register & 0x0ff );
129 return write(slave,
function, data, 4);
134 unsigned char *telptr;
135 int ret,len,byte_count,idata,i,itel,val;
186 byte_count =
tel[0]*256 +
tel[1];
206 tel[i] = (
unsigned char) itel;
208 if(
tel[i] == 0x0a)
break;
211 telptr = (
unsigned char *) strchr((
const char *)
tel,
':');
214 sscanf((
char *) &telptr[len],
"%02X",slave); len += 2;
215 sscanf((
char *) &telptr[len],
"%02X",
function); len += 2;
227 sscanf((
char *) &telptr[len],
"%02X",&byte_count); len += 2;
228 for(idata=0; idata<byte_count; idata++)
230 sscanf((
const char *) &telptr[len],
"%02X", &val); len += 2;
242 for(idata=0; idata<(byte_count/2); idata++)
251 for(idata=0; idata<(byte_count/2); idata++)
260 for(idata=0; idata<(byte_count/2); idata++)
268 sscanf((
char *) &telptr[len],
"%04X",&byte_count); len += 4;
269 for(idata=0; idata<(byte_count/2); idata++)
287 *
function =
tel[len++];
301 byte_count =
tel[len++];
304 memcpy(&
tel[len],data,byte_count+2); len += byte_count + 2;
315 memcpy(&
tel[len],data,byte_count+2); len += byte_count + 2;
322 memcpy(&
tel[len],data,byte_count+2); len += byte_count + 2;
329 memcpy(&
tel[len],data,byte_count+2); len += byte_count + 2;
335 byte_count =
tel[len]*256 +
tel[len+1]; len += 2;
338 memcpy(&
tel[len],data,byte_count+2); len += byte_count + 2;
352 unsigned char *telptr;
353 int ret,len,byte_count,i,itel,val;
363 if(transactionID != NULL) *transactionID =
tel[0] * 256 +
tel[1];
390 byte_count = data[4];
396 byte_count = data[0];
404 byte_count = data[8];
427 tel[i] = (
unsigned char) itel;
429 if(
tel[i] == 0x0a)
break;
432 telptr = (
unsigned char *) strchr((
const char *)
tel,
':');
435 sscanf((
char *) &telptr[len],
"%02X",slave); len += 2;
436 sscanf((
char *) &telptr[len],
"%02X",
function); len += 2;
445 sscanf((
char *) &telptr[len],
"%02X",&val); data[0] = (
unsigned char) val; len += 2;
446 sscanf((
char *) &telptr[len],
"%02X",&val); data[1] = (
unsigned char) val; len += 2;
447 sscanf((
char *) &telptr[len],
"%02X",&val); data[2] = (
unsigned char) val; len += 2;
448 sscanf((
char *) &telptr[len],
"%02X",&val); data[3] = (
unsigned char) val; len += 2;
459 sscanf((
char *) &telptr[len],
"%02X",&val); data[0] = (
unsigned char) val; len += 2;
460 sscanf((
char *) &telptr[len],
"%02X",&val); data[1] = (
unsigned char) val; len += 2;
461 sscanf((
char *) &telptr[len],
"%02X",&val); data[2] = (
unsigned char) val; len += 2;
462 sscanf((
char *) &telptr[len],
"%02X",&val); data[3] = (
unsigned char) val; len += 2;
463 sscanf((
char *) &telptr[len],
"%02X",&byte_count); len += 2;
464 for(i=0; i<byte_count; i++)
466 sscanf((
char *) &telptr[len],
"%02X",&val); data[4+i] = (
unsigned char) val; len += 2;
472 sscanf((
char *) &telptr[len],
"%02X",&byte_count); len += 2;
473 for(i=0; i<byte_count; i++)
475 sscanf((
char *) &telptr[len],
"%02X",&val); data[i] = (
unsigned char) val; len += 2;
480 sscanf((
char *) &telptr[len],
"%02X",&val); data[0] = (
unsigned char) val; len += 2;
481 sscanf((
char *) &telptr[len],
"%02X",&val); data[1] = (
unsigned char) val; len += 2;
482 sscanf((
char *) &telptr[len],
"%02X",&val); data[2] = (
unsigned char) val; len += 2;
483 sscanf((
char *) &telptr[len],
"%02X",&val); data[3] = (
unsigned char) val; len += 2;
484 sscanf((
char *) &telptr[len],
"%02X",&val); data[4] = (
unsigned char) val; len += 2;
485 sscanf((
char *) &telptr[len],
"%02X",&val); data[5] = (
unsigned char) val; len += 2;
489 sscanf((
char *) &telptr[len],
"%02X",&val); data[0] = (
unsigned char) val; len += 2;
490 sscanf((
char *) &telptr[len],
"%02X",&val); data[1] = (
unsigned char) val; len += 2;
491 sscanf((
char *) &telptr[len],
"%02X",&val); data[2] = (
unsigned char) val; len += 2;
492 sscanf((
char *) &telptr[len],
"%02X",&val); data[3] = (
unsigned char) val; len += 2;
493 sscanf((
char *) &telptr[len],
"%02X",&val); data[4] = (
unsigned char) val; len += 2;
494 sscanf((
char *) &telptr[len],
"%02X",&val); data[5] = (
unsigned char) val; len += 2;
495 sscanf((
char *) &telptr[len],
"%02X",&val); data[6] = (
unsigned char) val; len += 2;
496 sscanf((
char *) &telptr[len],
"%02X",&val); data[7] = (
unsigned char) val; len += 2;
497 sscanf((
char *) &telptr[len],
"%02X",&byte_count); len += 2;
498 for(i=0; i<byte_count; i++)
500 sscanf((
char *) &telptr[len],
"%02X",&val); data[8+i] = (
unsigned char) val; len += 2;
505 sscanf((
char *) &telptr[len],
"%02X",&val); data[0] = (
unsigned char) val; len += 2;
506 sscanf((
char *) &telptr[len],
"%02X",&val); data[1] = (
unsigned char) val; len += 2;
519 *
function =
tel[len++];
531 memcpy(&
tel[len],data,4+2); len += 4+2;
543 memcpy(&
tel[len],data,5); len += 5;
544 byte_count = data[4];
546 memcpy(&
tel[len],&data[4],byte_count+2); len += byte_count+2;
552 memcpy(&
tel[len],data,1); len++;
553 byte_count = data[0];
555 memcpy(&
tel[len],data,byte_count+2); len += byte_count+2;
560 memcpy(&
tel[len],data,6+2); len += 6+2;
565 memcpy(&
tel[len],data,9); len += 9;
566 byte_count = data[8];
568 memcpy(&
tel[len],&data[8],byte_count+2); len += byte_count+2;
573 memcpy(&
tel[len],data,2+2); len += 2+2;
599 return (buf[0]*256 + buf[1]);
608 buf[0] = (
unsigned char) high;
609 buf[1] = (
unsigned char) low;
616 sscanf((
char *) buf,
"%04X",&val);
622 sprintf((
char *) buf,
"%04X",i);
632 for(i=1; i<len; i+=2)
634 sscanf((
const char *) &
tel[i],
"%1X", &high);
635 sscanf((
const char *) &
tel[i+1],
"%1X", &low);
639 lrc = ((
unsigned char)(-((
char) lrc)));
640 sprintf((
char *) &
tel[len],
"%02X",(
unsigned int) lrc);
649 if(len < 0)
return 1;
651 cptr = (
unsigned char *) strchr((
char *)
tel,
':');
652 if(cptr == NULL)
return 1;
655 for(i=1; i<len+2; i+=2)
657 sscanf((
const char *) cptr++,
"%1X", &high);
658 sscanf((
const char *) cptr++,
"%1X", &low);
662 if(lrc == 0)
return 0;
669 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
670 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
671 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
672 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
673 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
674 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
675 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
676 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
677 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
678 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
679 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
680 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
681 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
682 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
683 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
684 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
685 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
686 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
687 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
688 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
689 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
690 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
691 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
692 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
693 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
694 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
700 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
701 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
702 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
703 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
704 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
705 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
706 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
707 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
708 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
709 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
710 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
711 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
712 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
713 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
714 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
715 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
716 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
717 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
718 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
719 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
720 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
721 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
722 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
723 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
724 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
725 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
730 unsigned char crc_high, crc_low;
735 crc_high = crc_low = 0xff;
738 index = crc_low ^
tel[i];
743 tel[len+1] = crc_high;
748 unsigned char crc_high, crc_low;
752 if(len < 2)
return 1;
753 crc_high = crc_low = 0xff;
754 for(i=0; i<len-2; i++)
756 index = crc_low ^
tel[i];
760 if(crc_low !=
tel[len-2])
return 1;
761 if(crc_high !=
tel[len-1])
return 1;
768 int ret_slave, ret_function;
769 unsigned char data[256];
771 data[0] = (start_adr / 256) & 0x0ff;
772 data[1] = start_adr & 0x0ff;
773 data[2] = (number_of_coils / 256) & 0x0ff;
774 data[3] = number_of_coils & 0x0ff;
778 ret =
response(&ret_slave, &ret_function, status, timeout);
779 if(ret < 0 || ret_slave != slave || ret_function !=
ReadCoilStatus)
781 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
792 int ret_slave, ret_function;
793 unsigned char data[256];
795 data[0] = (start_adr / 256) & 0x0ff;
796 data[1] = start_adr & 0x0ff;
797 data[2] = (number_of_inputs / 256) & 0x0ff;
798 data[3] = number_of_inputs & 0x0ff;
802 ret =
response(&ret_slave, &ret_function, status, timeout);
805 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
816 int ret_slave, ret_function;
817 unsigned char data[256];
819 data[0] = (start_adr / 256) & 0x0ff;
820 data[1] = start_adr & 0x0ff;
821 data[2] = (number_of_registers / 256) & 0x0ff;
822 data[3] = number_of_registers & 0x0ff;
826 ret =
response(&ret_slave, &ret_function, data, timeout);
829 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
834 for(
int i=0; i<ret; i+=2)
836 registers[j++] = ((data[i] * 256) & 0x0ff) + (data[i+1] & 0x0ff);
845 int ret_slave, ret_function;
846 unsigned char data[256];
848 data[0] = (start_adr / 256) & 0x0ff;
849 data[1] = start_adr & 0x0ff;
850 data[2] = (number_of_registers / 256) & 0x0ff;
851 data[3] = number_of_registers & 0x0ff;
855 ret =
response(&ret_slave, &ret_function, data, timeout);
858 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
863 for(
int i=0; i<ret; i+=2)
865 registers[j++] = ((data[i] * 256) & 0x0ff) + (data[i+1] & 0x0ff);
874 int ret_slave, ret_function;
875 unsigned char data[256];
877 data[0] = (coil_adr / 256) & 0x0ff;
878 data[1] = coil_adr & 0x0ff;
881 if(value) data[2] = 0x0ff;
885 ret =
response(&ret_slave, &ret_function, data, timeout);
888 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
899 int ret_slave, ret_function;
900 unsigned char data[256];
902 data[0] = (register_adr / 256) & 0x0ff;
903 data[1] = register_adr & 0x0ff;
904 data[2] = (value / 256) & 0x0ff;
905 data[3] = value & 0x0ff;
909 ret =
response(&ret_slave, &ret_function, data, timeout);
912 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
923 int ret_slave, ret_function;
924 unsigned char data[256];
926 data[0] = (coil_adr / 256) & 0x0ff;
927 data[1] = coil_adr & 0x0ff;
928 data[2] = (number_of_coils / 256) & 0x0ff;
929 data[3] = number_of_coils & 0x0ff;
930 data[4] = (number_of_coils / 8) + 1;
932 for(i=0; i<data[4]; i++) data[5+i] = coils[i];
936 ret =
response(&ret_slave, &ret_function, data, timeout);
939 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
950 int ret_slave, ret_function;
951 unsigned char data[256];
953 data[0] = (start_adr / 256) & 0x0ff;
954 data[1] = start_adr & 0x0ff;
955 data[2] = (number_of_registers / 256) & 0x0ff;
956 data[3] = number_of_registers & 0x0ff;
957 data[4] = (number_of_registers * 2) & 0x0ff;
959 for(
int i=0; i<number_of_registers; i++)
961 data[j++] = (registers[i] / 256) & 0x0ff;
962 data[j++] = registers[i] & 0x0ff;
967 ret =
response(&ret_slave, &ret_function, data, timeout);
970 printf(
"rlMOdbus::ERROR response ret=%d slave=%d ret_slave=%d function=%d ret_function=%d timeout=%d\n",
int readBlock(unsigned char *buf, int len, int timeout=-1)
int readInputStatus(int slave, int start_adr, int number_of_inputs, unsigned char *status, int timeout=1000)
int write(const void *buf, int len)
int int2data(int val, unsigned char *data)
int readCoilStatus(int slave, int start_adr, int number_of_coils, unsigned char *status, int timeout=1000)
void registerSerial(rlSerial *serial)
void int2buf_ascii(int i, unsigned char *buf)
int buf2int_ascii(unsigned char *buf)
void registerSocket(rlSocket *socket)
static const unsigned char array_crc_low[]
static const unsigned char array_crc_high[]
int write(int slave, int function, const unsigned char *data, int len, int *transactionID=NULL)
int select(int timeout=500)
int read(void *buf, int len, int timeout=0)
int buf2int_rtu(unsigned char *buf)
int forceSingleCoil(int slave, int coil_adr, int value, int timeout=1000)
int presetMultipleRegisters(int slave, int start_adr, int number_of_registers, int *registers, int timeout=1000)
rlModbus(long max_telegram_length=1024, int mode=MODBUS_RTU, char end_delimitor=0x0a)
int readHoldingRegisters(int slave, int start_adr, int number_of_registers, int *registers, int timeout=1000)
int forceMultipleCoils(int slave, int coil_adr, int number_of_coils, unsigned char *coils, int timeout=1000)
int presetSingleRegister(int slave, int register_adr, int value, int timeout=1000)
void int2buf_rtu(int i, unsigned char *buf)
int response(int *slave, int *function, unsigned char *data, int timeout=1000)
int data2int(const unsigned char *data)
int request(int slave, int function, int start_adr, int num_register)
int readInputRegisters(int slave, int start_adr, int number_of_registers, int *registers, int timeout=1000)
int writeBlock(const unsigned char *buf, int len)
int readRequest(int *slave, int *function, unsigned char *data, int timeout=1000, int *transactionID=NULL)