Member 13937256 Ответов: 2

Связь между visual studio C # и ПЛК


Hello,

I need to make a system in Visual Studio (C #) that allows me to communicate with the PLC, I am using Delta PLC DVP28SV and Delta module DVPEN01.


I was reading the MODBUS TCP / IP communication, I can not understand.

How would you send the information to a specific PLC register from C # and how to identify that registry?

I would appreciate if someone could guide me on the subject.

Greetings.


Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ModbusTcp;


namespace Console_ping_Sr2_Electronico
{
    class Program
    {
        static void Main(string[] args)
        {

            System.Net.NetworkInformation.Ping Pings = new System.Net.NetworkInformation.Ping();
            int timeout = 1000;
            int i = 0;
            while (i != 1)
            {
                {
                    if (Pings.Send("192.168.178.111", timeout).Status == IPStatus.Success)
                    {
                        Console.WriteLine("Exito");
                        Thread.Sleep(2000);
                        Console.Clear();
                    }
                    else
                    {
                        
                            Console.WriteLine("Error");
                        Thread.Sleep(2000);
                        Console.Clear();

                    }
                }
            }
        }

Richard MacCutchan

Единственный способ найти ответ-изучить документацию к устройству, чтобы увидеть, какие команды и ответы оно использует.

2 Ответов

Рейтинг:
1

OriginalGriff

Вы должны поговорить с людьми, которые его создали - Дельта[^] - они должны обеспечить техническую поддержку и будут знать о своем продукте больше, чем мы. Если они этого не сделают, то найдите другого поставщика и потребуйте свои деньги обратно!
Скорее всего, у них уже есть рабочий пример кода, который вы можете использовать в качестве основы.


Рейтинг:
1

Rick York

Modbus TCP/IP-это очень, очень простой протокол. Он не требует явного подключения на уровне приложения-только подключение на уровне сокета. Это означает, что вы можете отправить ему сообщение, и он ответит на это сообщение, и это действительно все, о чем вам нужно беспокоиться. Конечно, если соединение разорвано, вам придется снова подключиться, но это то же самое с каждым сокетом.

Существует также довольно много примеров кода, некоторые из которых тоже находятся здесь. Просто найдите в статьях ключевое слово "modbus" и вот что он находит : Поиск[^]


Member 13937256

Я использую библиотеку EASYmodbus
Вы даете мне ошибку, и я хотел бы, чтобы вы помогли мне получить направление.

EasyModbus.Исключения.FunctionCodeNotSupportedException
HResult=0x80131500
Сообщение=функциональный код, не поддерживаемый мастером

Rick York

Нет, я не даю вам ошибки. В вашем коде есть ошибка, и описание точно говорит вам, что это такое. Вы просите у ПЛК Тип передачи данных, который он не поддерживает. Именно это и делает код функции - он определяет тип данных и то, что с ними делать (чтение или запись.)

Member 13937256

Код, который я использую, таков:

использование системы;
использование системы.Коллекции.Общий;
использование System.Linq;
использование System.Text;
использование системы.Нарезание резьбы.Задачи;
использование EasyModbus;




пространство имен comunicacion_tcp
{
классная программа
{
частная строка IpAddress = "192.168.178.111";
частный int-порт = 502;
частный ushort startAddres = 258;
частная количество ushort = 1;
частный ModbusClient modbustcp;
публичная программа()
{
modbustcp = новый ModbusClient(IP-адрес, порт);
modbustcp.Подключить();

int[] response = modbustcp.ReadInputRegisters(startAddres, quantity);
modbustcp.Отсоединить();
Приставка.WriteLine("значение входного регистра 1" + Ответ[0].Метод toString());
Приставка.WriteLine("значение входного регистра 2" + Ответ[1].Метод toString());
}
static void Main(string[] args)
{
Program _program = новая программа();
Приставка.ReadKey();
}
}
}

Member 13937256

В этой области кода я спрашиваю адрес записи, которую я собираюсь использовать, и номер:
int[] response = modbustcp.ReadInputRegisters(startAddres, quantity);
Любое предложение.

Rick York

Я вижу вызов ReadInputRegisters, и это должно сделать это для вас, но, по-видимому, это не так. Следующий шаг-покопаться в документации Delta и посмотреть, какие функциональные коды на самом деле поддерживает их ПЛК. Возможно, он не поддерживает чтение входных регистров. Если он действительно поддерживает это, то может возникнуть ошибка с библиотекой. В этот момент я бы запустил WireShark и посмотрел, как выглядят пакеты. Modbus TCP/IP документирован очень хорошо, и я думаю, что WireShark имеет встроенный фильтр для него, так что вы должны быть в состоянии видеть, что происходит. Я никогда не пользовался этой библиотекой, поэтому не могу помочь вам с подробностями о ней.

Member 13937256

Привет, я нашел это.
Должен ли я посылать вам эту форму символов?

КОД КОМАНДЫ: 03, СЧИТЫВАНИЕ НЕСКОЛЬКИХ
РЕГИСТР (T, C, D)
Каково максимальное количество регистров, которые могут быть прочитаны?
Пример: считывание катушек T20~T27 с идентификатора ведомого устройства#01
Master→ELC “: 01 03 06 14 00 08 DA CR LF”
Переданное сообщение:
Имя поля ASCII
Компания STX 3А (в шестнадцатеричном виде)
Ведомый Адрес 01
Код команды 03
Начальный Адрес Hi 06
Начальный Адрес Lo 14
Количество баллов Привет 00
Количество баллов Lo 08
Проверить ошибки (ЦУР) да
КОНЕЦ 1 0D
Конец 0 0A (шестигранный)

http://www.eaton.com/ecm/groups/public/@pub/@electrical/documents/content/mn05003003e.pdf