Merkury 203.2T and arduino

namiq
Offline
Зарегистрирован: 08.08.2016

Hello,

i want to read My Merkury meter via arduino with RS485. I have a RS485 shield for arduino. i can send command with php and get response from Merkury. But when i send this command with arduino i can not get anything. My code i as following.

My meter's serial number is 14981791.

Arduino code:

#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin
 
#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW
 
#define Pin13LED         13
byte code1[7] = {0x00,0xE4,0x9A,0x9F,0x63,0x1B,0x06};
 
/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
 /*-----( Declare Variables )-----*/
int byteReceived;
byte data[7];
String sent;
void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  Serial.println("SerialRemote");  // Can be ignored
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);  
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
  
  // Start the software serial port, to another device
  RS485Serial.begin(9600);   // set the data rate 
}//--(end setup )---
 
 
void loop()   
{
    
   
RS485Serial.write(code1,sizeof(code1));
     delay(50);
  while (RS485Serial.available()) 
  { 
   //Serial.println( RS485Serial.readString());
 byteReceived=RS485Serial.read();   
  Serial.print(byteReceived,HEX);  
   } 
  delay(2000);
}
 
My php code:
 
<?php
exec('mode COM5: baud=96 data=8 stop=1 parity=n xon=off to=on');
// Несмотря на настройки, порт правильно не откравается, перед запуском скрипта надо запустить родной софт
// причины такого поведения пока не выяснены
$f = fopen("COM5","r+");
$i=0;
$cmd = array(0x00,0xE4,0x9A,0x9F,0x63,0x1B,0x06);         // Команда "Мгновенные значения"
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);} // Сформировать строку символов для посылки в COM-порт
fwrite($f,$c);
$result=fread($f,12);
// Результат получаем в шестнадцатиричном виде, но его написание соответствует десятичному значению.
// Например 0x22 0x87 = 228,7 вольт. Переводим результат в человеческий вид.
$Uv = ((ord($result[5])>>4)*100)+((ord($result[5])&0x0f)*10)+(ord($result[6])>>4)+((ord($result[6])&0x0f)/10);
$Ia = ((ord($result[7])>>4)*10)+(ord($result[7])&0x0f)+((ord($result[8])>>4)/10)+((ord($result[8])&0x0f)/100);
$Pv = ((ord($result[9])&0x0f)*10)+(ord($result[10])>>4)+((ord($result[10])&0x0f)/10)+((ord($result[11])>>4)/100)+((ord($result[11])&0x0f)/1000);
// Значения Uv, Ia, Pv можно писать в базу...
echo "<br>Напряжение сети:  ".$Uv ." Uv";
echo "<br>Сила така :  ".$Ia ." Ia";
echo "<br>Потребляемая мощьность : ".$Pv." P kVt";
fclose($f);
?>
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Great! Please re-publish your code with respect to this forum rules and practice - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
By the way, please fix the misspelling in the third line from the bottom. You typed unnecessary "ь" in the word "мощность".