Jumat, 23 Februari 2018

arduino uno (modbus master) vs sdm120 (modbus Slave)

kali ini experiment tentang kwh 1 phasa yang sudah ada modbusnya yaitu EASTRON type sdm120. kwh ini mempunyai port serial RS485 untuk komunikasi modbusnya.
berikut register addressnya:


untuk lengkapnya bisa download disini

pertama coba dulu sdm dengan software modscan. gunakan usb to rs485




wiring kwh seperti pada gambar di kwh tersebut.
colokkan tegangan 220 dan kasih beban lampu atau terserah.


berikut setting dafaultnya :


 untuk lengkapnya download dibawah ini:
download user manual SDM120 


kwh ini menggunakan function code 3 type datanya float.


setelah semua data yang dicek sudah sesuai, lanjutkan mapping data di arduino.
apa tujuan mapping di arduino????????
- untuk merubah dari modbus rtu ke modbus tcp.
- untuk monitor kwh jarak jauh
- untuk kendalikan koskosan...

untuk mengambil data ke arduino, yang dibutuhkan antara lain:
  • ethernet shield
  • arduino uno /mega
  • shield rs485/ rs485 to ttl


berikut sketch experiment saya mengambil data tegangan:
 /*
Online Power Monitoring
Author  : Fuad Hasan
Created : 10 April 2017
*/
#include <SPI.h>
#include <Ethernet.h>
#include "Mudbus.h"

#include <SimpleModbusMaster.h>
#include <avr/wdt.h>
#define baud 2400
#define timeout 2000
#define polling 200 // the scan rate
#define retry_count 100

// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 2
// The total amount of available memory on the master to store data
#define TOTAL_NO_OF_REGISTERS 6


enum
{
  PACKET1,//device1
  //PACKET2,//device2
  TOTAL_NO_OF_PACKETS // leave this last entry
};

// Create an array of Packets to be configured
Packet packets[TOTAL_NO_OF_PACKETS];

// Masters register array
unsigned int regs[TOTAL_NO_OF_REGISTERS];

Mudbus Mb;
//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)
//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
//Port 502 (defined in Mudbus.h) MB_PORT

void setup()
{
  uint8_t mac[]     = { 0x96, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
  uint8_t ip[]      = { 192, 168, 3, 10 };
  uint8_t gateway[] = { 192, 168, 3, 1 };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);
  //Avoid pins 4,10,11,12,13 when using ethernet shield

  delay(5000);
  //Serial.begin(9600);
 
 
 
    // Initialize each packet
  modbus_construct(&packets[PACKET1], 1, READ_INPUT_REGISTERS, 0, 6, 0);//
  //modbus_construct(&packets[PACKET2], 2, READ_HOLDING_REGISTERS, 101, 43, 43);//
 
 
 
  // Initialize the Modbus Finite State Machine
  modbus_configure(&Serial, baud, SERIAL_8N1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
 
 // pinMode(LED, OUTPUT);
  //Serial.begin (9600);
  wdt_disable();
  //wdt_enable(WDTO_4S);
 
}
void(* resetFunc) (void) = 0;

void loop()
{
  modbus_update();
  Mb.Run();
  float Teg;
  unsigned long Teg1 = (unsigned long) regs[0]<<16| regs[1];
  Teg=*(float*)& Teg1;
 

 
   //mapping MODBUS
  Mb.R[0] = Teg;
     
}
berikut hasil experiment kali ini:

 

bila kurang jelas silahkan kontak: 081555305255

16 komentar:

  1. unsigned long Teg1 = (unsigned long) regs[0]<<16| regs[1]; // ini untuk register tegangan bukan om ?

    BalasHapus
    Balasan

    1. modbus_construct(&packets[PACKET1], 1, READ_INPUT_REGISTERS, 0, 6, 0) // cara menentukan ini gmana om ? saya ga paham

      Hapus
    2. baca datasheet modbus slave dulu.
      contoh Power meter.
      mau data apa yg dipanggil di arduino?
      misal voltage. dia di register brp?
      ikut function apa ?

      Hapus
    3. Om nanya donk, maksud baris ini. unsigned long Teg1 = (unsigned long) regs[0]<<16| regs[1].
      kenapa regs[0] digeser ke kiri 16 habis itu isinya di OR sama reg[1]. ndak paham blas,,

      Hapus
  2. Balasan
    1. dari sdm120 kan ada terminal rs485, itu pasang kabel sambungkan ke arduino memlalui ttl to rs485

      Hapus
  3. Gan, saya mau tanya.
    Saya buat datalogger pake sdm230, arduino uno + konverter ttl to rs485
    Codingan-nya apakah sama seperti diatas ?

    BalasHapus
    Balasan
    1. coba cek datasheetnya ? apakah register modbusnya apa sama?

      Hapus
  4. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  5. assalamualikum gan....
    klo cara reset ulang nilainya ke 0 lgi gmana ya gan?

    BalasHapus
  6. Kalau di tabel holding register formatnya real itu maksudnya gimana dan rumusnya gimana om..? Apakah sama menggunakan shift left?

    BalasHapus

signal gsm sim800l

Value RSSI dBm Condition 2 -109 Marginal 3 -107 Marginal 4 -105 Marginal 5 -103 Marginal 6 -101 Marginal 7 -99 Marginal 8 -97 Marginal 9 -95...