- Katılım
- 24 Şubat 2018
- Mesajlar
- 23,193
Son düzeneğin resmini ve son programı da koyayım belki birisi problemi hemen görecek. Programın tek yaptığı, 40301 MODBUS registerinden itibaren iki register okumak. Aslında sadece tek register lazım da, orada byte count mu yoksa register count mu tam belli değil o yüzden iki diye kullandım. 40301 reigsterinde firmware versiyon var, net bir sayı dönmesi lazım.
C:
#define PIN_DE 8
#define PIN_RE 9
static unsigned char cmd[10];
static unsigned long timer = 0;
static unsigned int crc_16 (unsigned char *buffer, unsigned int length)
{
unsigned int i, j, temp_bit, temp_int, crc;
crc = 0xFFFF;
for ( i = 0; i < length; i++ )
{
temp_int = (unsigned char) *buffer++;
crc ^= temp_int;
for ( j = 0; j < 8; j++ )
{
temp_bit = crc & 0x0001;
crc >>= 1;
if ( temp_bit != 0 )
crc ^= 0xA001;
}
}
return crc;
}
static void tx_mode()
{
digitalWrite(PIN_DE, 1);
digitalWrite(PIN_RE, 1);
}
static void rx_mode()
{
digitalWrite(PIN_DE, 0);
digitalWrite(PIN_RE, 0);
}
void setup()
{
Serial.begin(9600, SERIAL_8N1);
pinMode(PIN_DE, OUTPUT);
pinMode(PIN_RE, OUTPUT);
}
void loop()
{
if ((millis() - timer) > 1000lu)
{
timer = millis();
unsigned int reg_addr = 40301; // converter version
unsigned int count = 0;
cmd[count++] = 0x01; // device address
cmd[count++] = 0x03; // function code (read holding registers)
cmd[count++] = (reg_addr >> 8) & 0xff; // register start (high)
cmd[count++] = reg_addr & 0xff; // register start (low)
cmd[count++] = 0x00; // register count (high)
cmd[count++] = 0x02; // register count (low)
unsigned int crc = crc_16(cmd, count);
cmd[count++] = crc & 0xff;
cmd[count++] = (crc >> 8) & 0xff;
tx_mode();
delay(1);
Serial.write(cmd, count);
Serial.flush();
delay(1);
rx_mode();
}
}