Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6461
Последний выпуск: 19.06.2015

опрос прибора ч/з modbus протокол

90K
09 апреля 2013 года
gutalin
1 / / 09.04.2013
подскажите пожалуйста, что-то явно делаю не так, прибор опрашиваю по modbus rtu , но в ответ в response приходят одни нули , посылаю на прибор с адресом 2 команду 3 read holding registers регистры 0001 (значение температуры)
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

 


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        const byte address = 2;
        short[] values=new short [32] ;
        const ushort start = 0;
        const ushort registers = 1;
          public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            sp.Open();
            SendFc3(address, start, registers, ref values );

        }
     

        string modbusStatus;
     


        private void BuildMessage(byte address, byte type, ushort start, ushort registers, ref byte[] message)
        {
            byte[] CRC = new byte[2];
            message[0] = address;
            message[1] = type;
            message[2] = (byte)(start >> 8);
            message[3] = (byte)start;
            message[4] = (byte)(registers >> 8);
            message[5] = (byte)registers;
            GetCRC(message, ref CRC);
            message[message.Length - 2] = CRC[0];
            message[message.Length - 1] = CRC[1];
        }
   


        public bool SendFc3(byte address, ushort start, ushort registers, ref short[] values)
          {
              if (sp.IsOpen)
           {
               //Очищаем входной и выходной буфера:
            sp.DiscardOutBuffer();
            sp.DiscardInBuffer();
            //Function 3 request is always 8 bytes:
            byte[] message = new byte[8];
           //Function 3 response buffer:
           byte[] response = new byte[5 + 2 * registers];
          //Build outgoing modbus message:
           BuildMessage(address, (byte)3, start, registers, ref message);
            //Send modbus message to Serial Port:
try
{
sp.Write(message, 0, message.Length);
//GetResponse(ref response);
}
catch (Exception err)
{
modbusStatus = "Ошибка при чтении: " + err.Message;
return false;
}
//Evaluate message:
if (CheckResponse(response))
{
//Return requested register values:
for (int i = 0; i < (response.Length - 5) / 2; i++)
{
values[i] = response[2 * i + 3];
values[i] <<= 8;
values[i] += response[2 * i + 4];
}
modbusStatus = "Чтение выполнено!";
//label1.Text=response;
return true;
}
else
{
modbusStatus = "Ошибка CRC";
return false;
}
}
else
{
modbusStatus = "Порт связи закрыт!";
return false;
}
}



//}

         private bool CheckResponse(byte[] response)
        {
            //Perform a basic CRC check:
            byte[] CRC = new byte[2];
            GetCRC(response, ref CRC);
            if (CRC[0] == response[response.Length - 2] && CRC[1] == response[response.Length - 1])
                return true;
            else
                return false;
        }

        private void GetCRC(byte[] message, ref byte[] CRC)
          {
              //Function expects a modbus message of any length as well as a 2 byte CRC array in which to
              //return the CRC values:
 
               ushort CRCFull = 0xFFFF;
               byte CRCHigh = 0xFF, CRCLow = 0xFF;
               char CRCLSB;
   
               for (int i = 0; i < (message.Length) - 2; i++)
               {
                   CRCFull = (ushort)(CRCFull ^ message[i]);
   
                   for (int j = 0; j < 8; j++)
                   {
                       CRCLSB = (char)(CRCFull & 0x0001);
                       CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);
   
                      if (CRCLSB == 1)
                          CRCFull = (ushort)(CRCFull ^ 0xA001);
                  }
              }
              CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
              CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
          }


    }
}

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог