PDA

Просмотр полной версии : Сбор данных с приборов OWEN через System.IO.Ports.SerialPort



iKarma
19.02.2014, 22:27
Кто-нибудь пробовал собирать данные с приборов OWEN через System.IO.Ports.SerialPort? Если да, то как, например, мне выяснить значение какой-либо переменной?

ATA_jr
27.03.2015, 21:22
Тоже очень интересует этот вопрос!

Yegor
27.03.2015, 21:29
Что именно не получается?

ATA_jr
27.03.2015, 21:44
Не знаю что именно отправлять в порт для запроса информации. Хотелось бы увидеть что-то в этом роде.
17393

Соответственно, такая реализация отправки сообщения-запроса (для данного датчика, а не для ТРМ-200, конечно же):
...
private void SendMsg(Byte SensorAdr)
{
Byte[] OUTMessege = {0x68, 4, 0, 4, 8};
OUTMessege[2] = SensorAdr;
int CheckSum = SensorAdr + 8;
OUTMessege[4] = (Byte)CheckSum;
_serialPort.Write(OUTMessege, 0, 5);
}
...

Yegor
27.03.2015, 21:49
Это уже другой вопрос. Если вам «ехать», то есть готовая библиотека NModbus. Вот тут параллельная тема пошла: http://owen.ru/forum/showthread.php?t=20888&p=166343&viewfull=1#post166343

Если вам «шашечки» (в смысле узнать, что нужно голыми руками отправлять в порт и как разбирать ответ), то берите любое описание протокола (хоть даже примеры из Википедии (https://ru.wikipedia.org/wiki/Modbus)) и подставляйте туда номера регистров из руководства к ТРМ.

ATA_jr
27.03.2015, 21:54
Параллельная тема, это моя) не совсем понимаю как именно подключить эту библиотеку (NModbus)

Yegor
27.03.2015, 21:56
В курсе, что ваша. Зачем темы плодить? Вы бы хоть сказали для начала, с какой студией сидите.

ATA_jr
27.03.2015, 21:59
17394
Теперь буду писать только в эту тему.

Yegor
27.03.2015, 22:03
17395

17396

17397

ATA_jr
27.03.2015, 22:26
Зачем изобретать велосипед (https://code.google.com/p/nmodbus/)? Если студия с нюгетом, то открыть менеджер нюгетов и тупо добавить NModbus. Если нет, то добавить в солюшн как обычно ручками. Дальше просто
using System;
using Modbus.Device;
using System.IO.Ports;


namespace NModbusExample
{
class Program
{
static void Main(string[] args)
{
using (var port = new SerialPort("COM1") { BaudRate = 115200 })
{
port.Open();
var mbus = ModbusSerialMaster.CreateRtu(port);
var reg = mbus.ReadHoldingRegisters(1, 0, 1);
Console.WriteLine(reg[0]);
}
}
}
}Естественно, подставить свои параметры порта, адрес устройства и номер нужного регистра.

Спасибо за терпение, но ещё хотелось бы узнать по-подробнее по поводу последних двух строчек кода, а именно: что значат параметры "mbus.ReadHoldingRegisters(1, 0, 1);" (с первым понятно - адрес устройства).

Собственно, вот и ответ зачем нужно изобретать велосипед, на более низком уровне всё просто и понятно и не надо разбираться с тем как пользоваться какими-то чужими наработками.

Yegor
27.03.2015, 23:43
Номер регистра и число регистров. В модбасе данные устройств размазаны по этим 16-битным регистрам. Допустим, где-нибудь в руководстве к ТРМ написано, что температура лежит 32-битным числом формата IEEE754 в регистрах 16 и 17. Тогда вы можете запросить это значение как ReadHoldingRegisters(1, 16, 2). В ответ вам приходит массив из двух 16-битных чисел, которые вы сами должны интерпретировать как 32-битный float. Википедию открывайте кароч.

ATA_jr
28.03.2015, 16:34
Да, спасибо, я уже изучил и википедию, и вот это. (http://www.lammertbies.nl/comm/info/modbus.html) В общем огромное спасибо за помощь. Кажется что-то получил. Сейчас буду дальше разбираться.