Files
vms2016_kadisp/cVMS.NET_CS/Device/DigitalIndicator.cs

82 lines
2.5 KiB
C#

using AR;
using System;
using System.Windows.Media.Media3D.Converters;
using vmsnet.Configures;
namespace vmsnet
{
public class DigitalIndicator : JdModbusRTU
{
/// <summary>
/// default value = 1
/// </summary>
public byte SlaveID { get; set; } = 1; // Slave No
public DigitalIndicator(byte slaveID = 0) : base("", new RtuConfigure { BaudRate = 9600, DataBits = 8, StopBits = System.IO.Ports.StopBits.One, Parity = System.IO.Ports.Parity.None })
{
SlaveID = slaveID;
}
public DigitalIndicator(string comPort, RtuConfigure configure, byte slaveId = 0) : base(comPort, configure)
{
SlaveID = slaveId;
}
/// <summary>
/// value 값을 디스플레이에 전송합니다.
/// 전송 주소는 기본 0으로 설정되어 있습니다
/// 이 명령은 회신값을 체크하고 True를 반환하지 않습니다.
/// False 반환시에는 장치 상태를 점검 하세요
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public bool SetKA(int value)
{
// Config 에서 가져온 코드
var valuebuffer = new ushort[20];
valuebuffer[0] = Convert.ToUInt16(value);
for (int i = 1; i < valuebuffer.Length; i++) valuebuffer[i] = 0;
return WriteValue(valuebuffer);
// 이전 코드
//var buffer = splitI32(value);
//return WriteValue(buffer);
}
UInt16[] splitI32(Int32 value)
{
var hValue = (UInt16)(value >> 16); // 상위 16 Bit
var lValue = (UInt16)(value & 0xFFFF); // 하위 16 Bit
return new ushort[] { hValue, lValue };
}
public bool WriteValue(UInt16[] values)
{
if (IsOpen == false)
{
ErrorMessage = "포트가 열리지 않았습니다";
return false;
}
if (master == null)
{
ErrorMessage = "모드버스가 초기화 되지 않았습니다";
return false;
}
try
{
master.WriteMultipleRegisters(this.SlaveID, 0, values);
return true;
}
catch (Exception ex)
{
ErrorMessage = ex.Message;
return false;
}
}
}
}