int bit(int val) // read bit
{ // todo: adjust to your needs, this demo reads bits
int ret;
unsigned char buf[2],b;
if(val > 128) return -1;
shm.read(val/8,buf,2);
b = buf[0];
switch(val%8)
{
case 0:
ret = b & BIT0;
break;
case 1:
ret = b & BIT1;
break;
case 2:
ret = b & BIT2;
break;
case 3:
ret = b & BIT3;
break;
case 4:
ret = b & BIT4;
break;
case 5:
ret = b & BIT5;
break;
case 6:
ret = b & BIT6;
break;
case 7:
ret = b & BIT7;
break;
default:
return -1;
}
if(ret > 0) return 1;
return 0;
}
int writeSingleCoil(int adr, int value)
{ // todo: adjust to your needs
unsigned char buf[128];
buf[0] = 1; // slave
buf[1] = rlModbus::ForceMultipleCoils;
buf[2] = 0; buf[3] = adr; // coil adr
buf[4] = 0; buf[5] = 1; // quantity of coils
buf[6] = 1; // byte count
buf[7] = value; // force data
return mbx.write(buf,8);
}
int writeOutputs()
{ // todo: adjust to your needs
int ret,adr;
for(adr=0; adr<10; adr++)
{
ret = writeSingleCoil(adr,outBit[adr]);
if(ret < 0) return ret;
}
return 0;
}
|