|
rllib
1
|
00001 /*************************************************************************** 00002 rlmodbusclient.cpp - description 00003 ------------------- 00004 begin : Wed Jan 07 2004 00005 copyright : (C) 2004 by Rainer Lehrig 00006 email : lehrig@t-online.de 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This library is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as * 00013 * published by the Free Software Foundation * 00014 * * 00015 ***************************************************************************/ 00016 #include "rlmodbusclient.h" 00017 00018 rlModbusClient::rlModbusClient(const char *mbxname, const char *shmname, int shmsize) 00019 :rlMailbox(mbxname), rlSharedMemory(shmname, shmsize) 00020 { 00021 } 00022 00023 rlModbusClient::~rlModbusClient() 00024 { 00025 } 00026 00027 int rlModbusClient::write(int slave, int function, const unsigned char *data, int datalen) 00028 { 00029 unsigned char buf[512]; 00030 int i; 00031 00032 if(datalen < 0) return -1; 00033 if(datalen > 256) return -1; 00034 if(slave < 0) return -1; 00035 if(slave > 255) return -1; 00036 if(function < 0) return -1; 00037 buf[0] = slave; 00038 buf[1] = function; 00039 for(i=0; i<datalen; i++) 00040 { 00041 buf[i+2] = data[i]; 00042 } 00043 rlMailbox::write((void *) buf,datalen+2); 00044 return 0; 00045 } 00046 00047 int rlModbusClient::writeSingleCoil(int slave, int adr, int value) 00048 { 00049 unsigned char data[8]; 00050 00051 data[0] = adr/256; data[1] = adr & 0x0ff; 00052 data[2] = 0; data[3] = 0; 00053 if(value != 0) data[2] = 0x0ff; 00054 return write(slave, rlModbus::ForceSingleCoil, data, 4); 00055 } 00056 00057 int rlModbusClient::writeMultipleCoils(int slave, int adr, const unsigned char *values, int num_coils) 00058 { 00059 unsigned char data[512]; 00060 int i,byte_count; 00061 00062 if(num_coils <= 0) return -1; 00063 byte_count = ((num_coils-1)/8) + 1; 00064 data[0] = adr/256; data[1] = adr & 0x0ff; 00065 data[2] = num_coils/256; data[3] = num_coils & 0x0ff; 00066 data[4] = byte_count; 00067 for(i=0; i<byte_count; i++) 00068 { 00069 if((5+i) > (int) sizeof(data)) return -1; 00070 data[5+i] = values[i]; 00071 } 00072 return write(slave, rlModbus::ForceMultipleCoils, data, 5+byte_count); 00073 } 00074 00075 int rlModbusClient::writePresetSingleRegister(int slave, int adr, int value) 00076 { 00077 unsigned char data[8]; 00078 00079 data[0] = adr/256; data[1] = adr & 0x0ff; 00080 data[2] = value/256; data[3] = value & 0x0ff; 00081 return write(slave, rlModbus::PresetSingleRegister, data, 4); 00082 } 00083 00084 int rlModbusClient::writePresetMultipleRegisters(int slave, int adr, const int *values, int num_values) 00085 { 00086 unsigned char data[512]; 00087 int i; 00088 00089 data[0] = adr/256; data[1] = adr & 0x0ff; 00090 data[2] = num_values/256; data[3] = num_values & 0x0ff; 00091 data[4] = num_values*2; // byte count 00092 for(i=0; i<num_values; i++) 00093 { 00094 if((5+i*2) > (int) sizeof(data)) return -1; 00095 data[5+i*2] = values[i]/256; data[6+i*2] = values[i] & 0x0ff; 00096 } 00097 return write(slave, rlModbus::PresetMultipleRegs, data, 5+2*num_values); 00098 } 00099 00100 int rlModbusClient::readBit(int offset, int number) 00101 { 00102 int ret; 00103 unsigned char buf[128+1],b; 00104 00105 if(number < 0) return -1; 00106 if(number > 128) return -1; 00107 rlSharedMemory::read(offset,buf,(number/8)+1); 00108 b = buf[number/8]; 00109 switch(number%8) 00110 { 00111 case 0: 00112 ret = b & BIT0; 00113 break; 00114 case 1: 00115 ret = b & BIT1; 00116 break; 00117 case 2: 00118 ret = b & BIT2; 00119 break; 00120 case 3: 00121 ret = b & BIT3; 00122 break; 00123 case 4: 00124 ret = b & BIT4; 00125 break; 00126 case 5: 00127 ret = b & BIT5; 00128 break; 00129 case 6: 00130 ret = b & BIT6; 00131 break; 00132 case 7: 00133 ret = b & BIT7; 00134 break; 00135 default: 00136 return -1; 00137 } 00138 if(ret > 0) return 1; 00139 return 0; 00140 } 00141 00142 int rlModbusClient::readByte(int offset, int number) 00143 { 00144 unsigned char buf[4],b; 00145 00146 if(number < 0) return -1; 00147 if(number > 128) return -1; 00148 rlSharedMemory::read(offset+number,buf,1); 00149 b = buf[0]; 00150 return b; 00151 } 00152 00153 int rlModbusClient::readShort(int offset, int number) 00154 { 00155 unsigned char buf[4]; 00156 int s; 00157 00158 if(number < 0) return -1; 00159 if(number > 64) return -1; 00160 rlSharedMemory::read(offset+(number*2),buf,2); 00161 s = buf[0]*256 + buf[1]; 00162 return s; 00163 }
1.7.5.1