rllib  1
rlmodbusclient.cpp
Go to the documentation of this file.
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 }