Modbus 프로토콜로 가져온 데이터를 특정 객체의 속성에 자동으로 지정하는 기능을 만들었었습니다.
다음의 코드처럼 클래스와 각 속성에 특성을 부여할 수 있도록 만들었습니다.
class MainViewModel
{
public MainViewModel()
{
var channel = new TcpChannel("127.0.0.1", 502);
var @interface = new ModbusMasterInterface(new ModbusMaster(channel, new ModbusTcpSerializer()));
InterfaceObject = new InterfaceObject();
InterfaceHandlers = @interface.SetBindings(InterfaceObject);
@interface.Start();
}
public InterfaceObject InterfaceObject { get; }
public Dictionary<string, InterfaceHandler> InterfaceHandlers { get; }
}
[Modbus(1)] //슬레이브 주소: 1
class InterfaceObject : NotifyPropertyChangeObject
{
[DiscreteInput(100)]
public bool BitValue1 { get => Get(false); set => Set(value); }
[DiscreteInput(101)]
public bool BitValue2 { get => Get(false); set => Set(value); }
[InputRegister(200, BitFlagIndex = 0)]
public bool BitFlagValue1 { get => Get(false); set => Set(value); }
[InputRegister(200, BitFlagIndex = 1)]
public bool BitFlagValue2 { get => Get(false); set => Set(value); }
[InputRegister(300)] //100번지의 Word에서 Big 엔디안으로 첫 번째 byte값을 사용
public byte ByteValue1 { get => Get<byte>(123); set => Set(value); }
[InputRegister(300, SkipFirstByte = true)] //100번지의 Word에서 Big 엔디안으로 두 번째 byte값을 사용
public byte ByteValue2 { get => Get<byte>(234); set => Set(value); }
[InputRegister(301)]
public short Int16Value { get => Get<short>(12345); set => Set(value); }
[InputRegister(302)]
public int Int32Value { get => Get(23456); set => Set(value); }
[InputRegister(304)]
public long Int64Value { get => Get(34567L); set => Set(value); }
[InputRegister(308)]
public float SingleValue { get => Get(12.34f); set => Set(value); }
[InputRegister(310)]
public double DoubleValue { get => Get(56.78); set => Set(value); }
[Coil(400)]
public bool SetBitValue1 { get => Get(false); set => Set(value); }
[Coil(401)]
public bool SetBitValue2 { get => Get(false); set => Set(value); }
[HoldingRegister(500)]
public float SetSingleValue1 { get => Get(0f); set => Set(value); }
[HoldingRegister(502)]
public float SetSingleValue2 { get => Get(0f); set => Set(value); }
}
해당 객체의 속성들을 MVVM 패턴으로 바인딩하면 Modbus 프로토콜로 가져온 값을 화면에 바로 표시할 수 있습니다.
전체 예제 코드는 다음의 리포지토리에서 Samples/Modbus/WpfModbusMasterSample 프로젝트를 참고하시면 되겠습니다.
참고로 해당 프로젝트에서는 Modbus TCP를 이용하는데요, 시리얼 포트를 통해서도 통신 가능합니다.
Modbus 프로토콜 라이브러리도 직접 구현한 것이라 Modbus TCP, RTU, ASCII도 다 되고, 시리얼 포트와 TCP 및 UDP를 이용한 통신도 가능합니다.
Modbus 프로토콜 관련 소스코드는 다음의 리포지토리를 참고하시면 되겠습니다.