using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Windows;
using System.Threading;
namespace FX3GModbusAPI
{
public class FX3GModbusAPI
{
public struct Type
{
//FX3G
public static string Y = "3300"; //Y元件的定义
public static string X = "3400"; //X元件的定义
public static string S = "2000"; //S元件的定义
public static string M = "0000"; //M元件的定义
public static string TS = "3000"; //TS位元件的定义
public static string MR = "1E00"; //M8000~M8511字元件的定义
public static string CS = "3200"; //CS位元件的定义
public static string D = "0000"; //D0~D7999
public static string WD = "1F40"; //D8000~D8511
}
public enum SoftElemType
{
//FX3G
Y,
X,
S,
M,
TS,
MR,
CS,
D,
WD,
}
public struct FunctionName
{
public static string Read_线圈 = "01";//可多点
public static string Read_输入 = "02";//可多点
public static string Read_保持寄存器 = "03";//可多点
public static string Read_输入寄存器 = "04";//可多点
public static string Write_线圈写入 = "05";//仅一点
public static string Write_寄存器写入 = "06";//仅一点
public static string Write_批量线圈写入 = "0F";//多点线圈写入
public static string Write_批量寄存器写入 = "10";//多点保持寄存器写入
}
public SerialPort port;
// private StringBuilder myCompleteMessage = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。
public string STATE;
public string myCompleteMessage;
public int FX3G_Write_Soft_Elem(SoftElemType eType, int nStartAddr, int nCount, byte[] pValue, int nNetId = 0)
{
try
{
Addr = "";
senddata = "";
value = "";
//num = 0;
switch (eType)
{
case (SoftElemType.Y):
for (int i = 0; i < pValue.Length; i++)
value += string.Format("{0:x2}", pValue[i]);
Addr = Convert.ToString(nStartAddr + Convert.ToInt16(Type.Y.ToString(), 16), 16);
if (nCount == 1)
senddata = string.Format("{0:x2}{1}{2}", FunctionName.Write_线圈写入, Addr.PadLeft(4, '0'), value.PadLeft(4, '0'));
else senddata = string.Format("{0:x2}{1}{2}{3}{4}", FunctionName.Write_批量线圈写入, Addr.PadLeft(4, '0'), Convert.ToString(nCount, 16).PadLeft(4, '0'), Convert.ToString((nCount - 1) / 8 + 1, 16).PadLeft(4, '0'), value);
Write_port(senddata);
myCompleteMessage = myCompleteMessage.Replace(" ", "");
if (Convert.ToByte((myCompleteMessage.Substring(2, 2)), 16) != 0x05 && Convert.ToByte((myCompleteMessage.Substring(2, 2)), 16) != 0x0F) return -1;
break;
case (SoftElemType.M):
for (int i = 0; i < pValue.Length; i++)
value += string.Format("{0:x2}", pValue[i]);
Addr = Convert.ToString(nStartAddr + Convert.ToInt16(Type.M.ToString(), 16), 16);
int len = nCount / 8;
if (nCount % 8 != 0)
{
len += 1;
}
if (nCount =