delta DVP28SV2+овен мв110-224.1тд+тензодатчик
-
- Сообщения: 16
- Зарегистрирован: 18 фев 2023, 12:27
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
тут как раз таки стоит задача справиться без ОПС сервера. построить опрос через ПЛК.
спецификацию читал. пробовал следующим образом:
ushort[] holding_register = master.ReadHoldingRegisters(16, 4099, 4);
// Отображаем текст на форме
this.Invoke(new EventHandler(textBox1_TextChanged));
}
// Обновляем текст на форме
private void textBox1_TextChanged(object sender, EventArgs e)
{
this.txtReceived.Text = master;
}
теперь столкнулся с ошибкой Ошибка CS0029 Не удается неявно преобразовать тип "Modbus.Device.ModbusSerialMaster" в "string".
пробовал BitConverter.ToString() но не помогает
спецификацию читал. пробовал следующим образом:
ushort[] holding_register = master.ReadHoldingRegisters(16, 4099, 4);
// Отображаем текст на форме
this.Invoke(new EventHandler(textBox1_TextChanged));
}
// Обновляем текст на форме
private void textBox1_TextChanged(object sender, EventArgs e)
{
this.txtReceived.Text = master;
}
теперь столкнулся с ошибкой Ошибка CS0029 Не удается неявно преобразовать тип "Modbus.Device.ModbusSerialMaster" в "string".
пробовал BitConverter.ToString() но не помогает
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
Я вас не отговариваю. Просто предлагаю использовать ОПС для проверки связи с ПЛК.gallyamov_mm_91 писал(а): ↑15 мар 2023, 09:35тут как раз таки стоит задача справиться без ОПС сервера. построить опрос через ПЛК.
В данный момент причин отсутствия чтения море. Начиная от вашего приложения, заканчивая проводами, протоколом, и т.д.
Наладите опрос ПЛК через ОПС, потом уже спокойно терзайте C#.
-
- Сообщения: 16
- Зарегистрирован: 18 фев 2023, 12:27
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
Связь с плк фиксируется же при подключение когда мы открываем порт, да и в самом ПЛК я вижу индикацию обмена по 232 интерфейсу
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
Код: Выделить всё
holding_register = master.ReadHoldingRegisters(16, 4099, 4);
Код: Выделить всё
this.txtReceived.Text = master;
--
nmodbus хорошая библиотека под Net.
ftp://ftp.icpdas.com/pub/cd/8000cd/napd ... dbus/demo/
тут есть хорошие примеры под неё
-
- Сообщения: 16
- Зарегистрирован: 18 фев 2023, 12:27
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
на данный момент программа практически готова. идет непрерывный опрос, данные идут единственное не устраивает формат данных.
когда я опрашиваю ОПС сервером один и тот же регистр (рис4) я могу указать в настройках тип данных. по умолчанию там идет INT16, когда я ставлю FLOAT я получаю данные в том виде как и должно быть(52.5206) как реализовать это в программе. пытался конвертировать но что то не выходит. может метод считывания другой выбрать
когда я опрашиваю ОПС сервером один и тот же регистр (рис4) я могу указать в настройках тип данных. по умолчанию там идет INT16, когда я ставлю FLOAT я получаю данные в том виде как и должно быть(52.5206) как реализовать это в программе. пытался конвертировать но что то не выходит. может метод считывания другой выбрать
- Вложения
-
- WindowsFormsApp8.7z
- (131 КБ) 60 скачиваний
-
- 4.jpg (29.56 КБ) 1245 просмотров
-
- 3.jpg (44.39 КБ) 1245 просмотров
-
- Сообщения: 16
- Зарегистрирован: 18 фев 2023, 12:27
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
using Modbus.Device;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp8
{
public partial class Form1 : Form
{
SerialPort port = new SerialPort();
private bool is_running = false;
public Form1()
{
InitializeComponent();
label1.Text = "Порт закрыт";
label2.Text = "опроса остановлен";
}
private void Form1_Load(object sender, EventArgs e)
{
}
// Открытие COM-порта
private void button1_Click(object sender, EventArgs e)
{
if (port.IsOpen == false)
{
port = new SerialPort("COM2", 9600, Parity.Even, 7, StopBits.One);
port.Open();
label1.Text = "Порт открыт";
}
}
// Закрытие COM-порта
private void button2_Click(object sender, EventArgs e)
{
if (port.IsOpen == true)
{
port.Close();
label1.Text = "Порт закрыт";
}
}
// Начало опроса
private void button3_Click(object sender, EventArgs e)
{
label2.Text = "опроса идет";
is_running = true;
ThreadPool.QueueUserWorkItem((useless) =>
{
while (is_running)
{
if (port.IsOpen == true)
{
ModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);
ushort startAddress = 4099; // Начальный адрес
ushort numInputs = 1; // Количество регистров для запроса
ushort[] inputs;
try
{
inputs = master.ReadHoldingRegisters(16, startAddress, numInputs);
}
catch (Exception ex)
{
textBox1.Text = ex.Message;
break;
}
foreach (ushort input in inputs)
{
this.Invoke((System.Action)(() =>
{
textBox1.Clear();
textBox1.Text += input.ToString() + "\t";
chart1.Series["Series1"].Points.Add(input);
}));
}
Thread.Sleep(1000);
}
}
});
}
// Остановка опроса
private void button4_Click(object sender, EventArgs e)
{
is_running = false;
textBox1.Clear();
label2.Text = "опроса остановлен";
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp8
{
public partial class Form1 : Form
{
SerialPort port = new SerialPort();
private bool is_running = false;
public Form1()
{
InitializeComponent();
label1.Text = "Порт закрыт";
label2.Text = "опроса остановлен";
}
private void Form1_Load(object sender, EventArgs e)
{
}
// Открытие COM-порта
private void button1_Click(object sender, EventArgs e)
{
if (port.IsOpen == false)
{
port = new SerialPort("COM2", 9600, Parity.Even, 7, StopBits.One);
port.Open();
label1.Text = "Порт открыт";
}
}
// Закрытие COM-порта
private void button2_Click(object sender, EventArgs e)
{
if (port.IsOpen == true)
{
port.Close();
label1.Text = "Порт закрыт";
}
}
// Начало опроса
private void button3_Click(object sender, EventArgs e)
{
label2.Text = "опроса идет";
is_running = true;
ThreadPool.QueueUserWorkItem((useless) =>
{
while (is_running)
{
if (port.IsOpen == true)
{
ModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);
ushort startAddress = 4099; // Начальный адрес
ushort numInputs = 1; // Количество регистров для запроса
ushort[] inputs;
try
{
inputs = master.ReadHoldingRegisters(16, startAddress, numInputs);
}
catch (Exception ex)
{
textBox1.Text = ex.Message;
break;
}
foreach (ushort input in inputs)
{
this.Invoke((System.Action)(() =>
{
textBox1.Clear();
textBox1.Text += input.ToString() + "\t";
chart1.Series["Series1"].Points.Add(input);
}));
}
Thread.Sleep(1000);
}
}
});
}
// Остановка опроса
private void button4_Click(object sender, EventArgs e)
{
is_running = false;
textBox1.Clear();
label2.Text = "опроса остановлен";
}
}
}
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
Команды преобразования типов в вашей среде программирования есть? Нужно просто преобразовать Int во Float. Имейте в виду, что Float 32 бита.
Вариант 2 произвести перестановку в вашей программе : 2.1 побайтно.( 8 бит) 2.2 - пословно ( 16 бит).
Вариант 2 произвести перестановку в вашей программе : 2.1 побайтно.( 8 бит) 2.2 - пословно ( 16 бит).
-
- Сообщения: 16
- Зарегистрирован: 18 фев 2023, 12:27
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
а можно не много по подробнее, я просто новичок в этом деле и пока не сильно понимаю
-
- Сообщения: 16
- Зарегистрирован: 18 фев 2023, 12:27
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
есть команды на подобии Convert.ToFloat. но это несовсем то что мне надо.
у меня на входе 16977 на выходе, в идеале должно стать 52,5206.
а при помощи Convert.ToFloat я из 16977 получаю 16977,0
у меня на входе 16977 на выходе, в идеале должно стать 52,5206.
а при помощи Convert.ToFloat я из 16977 получаю 16977,0
Re: delta DVP28SV2+овен мв110-224.1тд+тензодатчик
Данные в ПЛК в каком формате?