Вход

Просмотр полной версии : Портирование кода и библиотек с Windows (С#+dotnet core+OwenioNet) на Linux



nayaganov
09.08.2018, 15:23
Имеется проект Подключение МДВВ через MOXA к серверу приложений, реализованного на dotnet core 2.1 под Windows.
Для миграции сервера с Windows на Linux необходимо портировать код, т.к. System.IO.Ports на текущий момент поддерживает только ОС Windows.
Для работы в Linux с последовательным портом использую SerialPortStream, но в OwenioNet.dll для работы с последовательными портами используется пространство имен System.IO.Ports.

Кто-нибудь сталкивался с подобной проблемой?
В целом разработчики ПО Овен могут предоставить исходники OwenioNet.dll?

p.s. Альтернатива - начал изучение использования ModBus, но у меня изначально были затруднения в этом направлении.

Новикова Маргарита
13.08.2018, 09:20
Имеется проект Подключение МДВВ через MOXA к серверу приложений, реализованного на dotnet core 2.1 под Windows.
Для миграции сервера с Windows на Linux необходимо портировать код, т.к. System.IO.Ports на текущий момент поддерживает только ОС Windows.
Для работы в Linux с последовательным портом использую SerialPortStream, но в OwenioNet.dll для работы с последовательными портами используется пространство имен System.IO.Ports.

Кто-нибудь сталкивался с подобной проблемой?
В целом разработчики ПО Овен могут предоставить исходники OwenioNet.dll?

p.s. Альтернатива - начал изучение использования ModBus, но у меня изначально были затруднения в этом направлении.


Добрый день!
Попробуйте пример во вложении.

nayaganov
13.08.2018, 13:55
Добрый день!
Попробуйте пример во вложении.

Приветствую!
Мой код:


public static string OwenReadDiscreteInputs(string comPortNumber)
{
/*
* Discrete Inputs Map:
* Input #1 - Barrier Open State;
* Input #2 - Barrier Close State;
*/
byte[] discreteInputs = new byte[] { 0,0 };
string barrierState = "0";

SerialPortStreamAdapter port = new SerialPortStreamAdapter(comPortNumber, 9600, Parity.None, 8, StopBits.One);
try
{
port.Open();
}
catch(System.IO.IOException)
{
string result = System.String.Format("Ошибка открытия порта {0}", comPortNumber);
return result;
}

var owenProtocol = OwenProtocolMaster.Create(port);

discreteInputs = owenProtocol.OwenRead(16, AddressLengthType.Bits8, "r.Cn");

// Barrier Open/Closed State checking
if((discreteInputs[1] & 0b00000001) == 0b00000001) // Barrier Open
{
barrierState = "Open";
}
else if((discreteInputs[1] & 0b00000010) == 0b00000010) // Barrier Closed
{
barrierState = "Closed";
}

// var discreteInputsString = ConverterAscii.ConvertBack(discreteInputs);

owenProtocol.CloseSerialPort();
owenProtocol.Dispose();

return barrierState;

}


Ошибка в части

var owenProtocol = OwenProtocolMaster.Create(port);
так как данный метод использует

public static IOwenProtocolMaster Create(SerialPort serialPort, IPackageLogger logging = null);
(класс OwenProtocolMaster.cs) значение "SerialPort", мне необходимо заменить на "SerialPortStream". Использую фреймворк RJCP.IO.Ports вместо System.IO.Ports.

Как стоит поступить? Можно ли переписать класс OwenProtocolMaster.cs?

p.s. в с# я сосвем еще плох)

melky
13.08.2018, 14:53
а посмотреть реализацию в Mono не вариант ? там библиотеки C# работают вроде из коропки...

nayaganov
14.08.2018, 13:06
а посмотреть реализацию в Mono не вариант ? там библиотеки C# работают вроде из коропки...
Для протокола Овен?

melky
14.08.2018, 14:07
При чем тут протокол Овен ? я про работу Com порта. Mono это среда разработки .NET приложений, и приложения, написанные на C# в Windows работают под Linux. dll, работающая с портом не требует изменения кода.
Вот и посмотреть как происходит работа с портом непосредственно на Linux.

Ну или вообще попробуйте на Linux в Mono в среде разработки свои исходники загрузить, наверняка что-то выясните...

nayaganov
16.08.2018, 07:29
а посмотреть реализацию в Mono не вариант ? там библиотеки C# работают вроде из коропки...

Проблема не в реализации работы с com-портом под Linux, а в том чтобы в исходниках owenionet.dll сделать пару правок.
Одна из причин использования протокола Овен - нестабильной связи по ModBus, постоянно вылетает ошибка CRC (Win и Linux). Пробовал менять скорость приемо-передачи, но результата нет.
Протокол Овен работает более ли менее стабильно.

В целом используется связка устройств Овен МДВВ <-> Moxa <-> сеть <-> ПК. Овен МДВВ и Moxa расположены в одном шкафу, связь с Moxa по TCP.
Писать свою реализацию протокола Овен - крайний вариант.

Поэтому смена IDE мне никак не поможет.

melky
17.08.2018, 10:54
что, owenionet.dll прямо таки защищена от вкрытия ?