Needed
1 RaspberryPI
1 EJS 212 D2AMX Energy meter with ModBus
1 USB<>RS485 Converter
1 twisted pair cable
recommend install Raspbian
Set speed USB port - 9'600 bps, 8E1
stty -F /dev/ttyUSB0 9600 cs8 parenb -parodd
C code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
int main(int argc, char* argv[]) {
struct termios serial;
char inBuff[16];
char *buffer;
char choice[5];
int wcount = 0;
char rdINPUT[8]= {0x22,0x04,0x00,0x00,0x00,0x06,0x77,0x5B};
int fd = open("/dev/ttyUSB2", O_RDWR | O_NOCTTY | O_NDELAY);
double tariff1,tariff2,tariff3;
if (fd == -1) {
perror(argv[2]);
return -1;
}
if (tcgetattr(fd, &serial) < 0) {
perror("Getting configuration");
return -1;
}
//////////////////// Set up Serial Configuration ////////////
serial.c_iflag = 0;
serial.c_oflag = 0;
serial.c_lflag = 0;
serial.c_cflag = 0;
serial.c_cc[VMIN] = 0;
serial.c_cc[VTIME] = 10;
serial.c_cflag = B9600 | CS8 | PARENB | CREAD & ~PARODD;
fcntl(fd,F_SETFL,0);
tcsetattr(fd, TCSANOW, &serial); // Apply configuration
//////////////////////////////////////////////////////////////
int rcount;
buffer = &inBuff[0];
int i = 0;
int j = 0;
write(fd,rdINPUT,8);
buffer = &inBuff[0];
printf("Send: ");
for(j = 0;j < sizeof(rdINPUT);j++)
{
printf("%02x ",rdINPUT[j]);
}
printf("\r\n");
printf("Received: " );
while( (rcount = read(fd,buffer,1)) > 0)
{
if (rcount < 0) {
perror("Read");
return -1;
}
buffer++;
printf("%02x ",inBuff[i]); i++;
}
tariff2 =(double)(256*256*256*inBuff[3]) + (double)(256*256*inBuff[4]) + (double)(256*inBuff[5]) + (double)inBuff[6];
tariff2 =(double)(256*256*256*inBuff[7]) + (double)(256*256*inBuff[8]) + (double)(256*inBuff[9]) + (double)inBuff[10];
tariff1 =(double)(256*256*256*inBuff[11]) + (double)(256*256*inBuff[12]) + (double)(256*inBuff[13]) + (double)inBuff[14];
printf("\r\n");
printf("Peak Tariff 3: %4.3f KWh",tariff3/100);
printf("\r\n");
printf("Daily Tariff 2: %4.3f KWh",tariff2/100);
printf("\r\n");
printf("Night Tariff 1: %4.3f KWh",tariff1/100);
printf("\r\n");
close(fd);
}
Input Registers
Address |
Value |
0x00 |
Energy tariff 3 - peak (most significant part) |
0x01 |
Energy tariff 3 - peak (low significant part) |
0x02 |
Energy tariff 2 - peak (most significant part) |
0x03 |
Energy tariff 2 - peak (low significant part) |
0x04 |
Energy tariff 1 - peak (most significant part) |
0x05 |
Energy tariff 1 - peak (low significant part) |
Note: All values of the energy registers are in hundredths of KWh, 1 from the register corresponds to 0.01 KWh