WPF와 MVVM 패턴을 활용하여 시리얼 통신을 구현한 오픈소스 프로젝트 중에서 추천할 만한 것이 있을까요?

안녕하세요.

현재 WPF에서 MVVM 패턴을 적용하여 시리얼 통신을 구현하는 것을 공부하고 있습니다. 이를 더욱 효과적으로 학습하고 실무에도 응용할 수 있도록, 시리얼 통신이나 모드버스(Modbus)와 관련된 오픈소스 프로젝트를 찾아보고 있습니다.

혹시 WPF와 MVVM 패턴을 활용하여 시리얼 통신을 구현한 오픈소스 프로젝트 중에서 추천할 만한 것이 있을까요? 또는 모드버스를 적용한 프로젝트 중에서 참고할 만한 자료가 있다면 알려주시면 감사하겠습니다.

좋은 오픈소스 프로젝트가 있다면 추천 부탁드립니다!

1개의 좋아요

https://www.google.com/search?q=c%23+wpf+mvvm+serial+port&newwindow=1

@Vagabond-K 님의 Github 저장소에 여러 프로토콜 를 라이브러리로 만드러놓으신게있어요.

여기에 Mvvm을 붙여보시는걸…

4개의 좋아요

예전에 개인적으로 쓰려고 만들었던 것을 소개 드려봅니다.

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 프로토콜로 가져온 값을 화면에 바로 표시할 수 있습니다.

<GroupBox Header="Input Register" DataContext="{Binding InterfaceObject}">
    <UniformGrid Margin="3" Columns="1">
        <TextBlock>[200.0] BitFlagValue1: <Run Text="{Binding BitFlagValue1}"/></TextBlock>
        <TextBlock>[200.1] BitFlagValue2: <Run Text="{Binding BitFlagValue2}"/></TextBlock>
        <TextBlock>[300.0] ByteValue1: <Run Text="{Binding ByteValue1}"/></TextBlock>
        <TextBlock>[300.1] ByteValue2: <Run Text="{Binding ByteValue2}"/></TextBlock>
        <TextBlock>[301] Int16Value: <Run Text="{Binding Int16Value}"/></TextBlock>
        <TextBlock>[302] Int32Value: <Run Text="{Binding Int32Value}"/></TextBlock>
        <TextBlock>[304] Int64Value: <Run Text="{Binding Int64Value}"/></TextBlock>
        <TextBlock>[308] SingleValue: <Run Text="{Binding SingleValue}"/></TextBlock>
        <TextBlock>[310] DoubleValue: <Run Text="{Binding DoubleValue}"/></TextBlock>
    </UniformGrid>
</GroupBox>

전체 예제 코드는 다음의 리포지토리에서 Samples/Modbus/WpfModbusMasterSample 프로젝트를 참고하시면 되겠습니다.

참고로 해당 프로젝트에서는 Modbus TCP를 이용하는데요, 시리얼 포트를 통해서도 통신 가능합니다.
Modbus 프로토콜 라이브러리도 직접 구현한 것이라 Modbus TCP, RTU, ASCII도 다 되고, 시리얼 포트와 TCP 및 UDP를 이용한 통신도 가능합니다.
Modbus 프로토콜 관련 소스코드는 다음의 리포지토리를 참고하시면 되겠습니다.

부끄럽지만 관련 블로그 글도 공유 드립니다.
C# 객체 매핑을 이용한 Modbus 프로토콜 인터페이스 라이브러리
이게 과연 얼마나 도움이 될 지는 잘 모르겠네요. ㅎㅎㅎ

4개의 좋아요

아이고~ 답글을 남기는 동안 먼저 소개를 해주셨네요!! ㅎㅎㅎ :sweat_smile:

1개의 좋아요

이 문구 보자마자… 예전에 @Vagabond-K 님이 만들어놓으신 저장소가 떠올랐거든요…헷

1개의 좋아요

감사합니다 .하나씩 확인해 볼게요. ㅎㅎ