Commit 0722175b LN

零点IO模块dll更新

1 个父辈 e6cebdb4
......@@ -35,8 +35,8 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="AIOBOX">
<HintPath>..\dll\AIOBOX.dll</HintPath>
<Reference Include="Asa.IOModule.AIOBOX">
<HintPath>..\dll\Asa.IOModule.AIOBOX.dll</HintPath>
</Reference>
<Reference Include="halcondotnet">
<HintPath>..\dll\halcondotnet.dll</HintPath>
......
using log4net;
using Asa.IOModule;
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using Asa.AIOBOX;
using System.Threading;
using System.Threading;
using System.Threading.Tasks;
using TSA_V.Common;
......@@ -13,98 +13,143 @@ namespace TSA_V.DeviceLibrary
{
public class AIOBOXManager : IOBase
{
public readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public Dictionary<string, AIOBOX_32> AIOMap = new Dictionary<string, AIOBOX_32>();
public string DefaultIP = "";
public Dictionary<string, List<Status>> DIValueMap = new Dictionary<string, List<Status>>();
public Dictionary<string, List<Status>> DOValueMap = new Dictionary<string, List<Status>>();
//public static uint DefaultDICount = 16;
//public static uint DefaultDOCount = 16;
//public readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public Dictionary<string, AIOBOX> AIOMap = new Dictionary<string, AIOBOX>();
public Dictionary<string, List<Box_Sta>> DIValueMap = new Dictionary<string, List<Box_Sta>>();
public Dictionary<string, List<Box_Sta>> DOValueMap = new Dictionary<string, List<Box_Sta>>();
private object DIMapLock = "";
private object DOMapLock = "";
public System.Timers.Timer timer = null;
private object DILock = "";
private object DOLock = "";
public AIOBOXManager()
{
DIStartAddress =(int) Addr.DI_1;
DoStartAddress = (int)Addr.DO_1;
DIStartAddress = (int)0;
DoStartAddress = (int)0;
}
public override void ConnectionIP(string ioIp, ushort port)
{
AIOBOX_32 aioBox = null;
private List<string> IoIPLIst = new List<string>();
private System.Timers.Timer conTimer = null;
private bool isProcess = false;
private DateTime lastTime = DateTime.Now;
public void ConnectionIP(string ioIp)
{
AIOBOX aioBox = null;
if (AIOMap.ContainsKey(ioIp))
{
aioBox = AIOMap[ioIp];
if (null != aioBox)
try
{
aioBox.Close();
aioBox = null;
if (null != aioBox)
{
aioBox.Close();
aioBox = null;
}
}
catch (Exception ex)
{
LogUtil.error("关闭Io模块【" + ioIp + "】出错:" + ex.ToString());
}
AIOMap.Remove(ioIp);
}
if (DIValueMap.ContainsKey(ioIp))
{
DIValueMap.Remove(ioIp);
DIValueMap.Remove(ioIp);
}
if (DOValueMap.ContainsKey(ioIp))
{
DOValueMap.Remove(ioIp);
DOValueMap.Remove(ioIp);
}
int DIMS = ConfigAppSettings.GetIntValue("DIMS");
if (DIMS <= 0)
{
DIMS = 150;
}
else if (DIMS < 20)
{
DIMS = 100;
}
int DOMS = ConfigAppSettings.GetIntValue("DOMS");
if (DOMS <= 0)
{
DOMS = 300;
}
else if (DOMS < 100)
{
DOMS = 300;
}
int DILength = DefaultDILength;
int DOLength = DefaultDOLength;
string logName = "IO模块[" + ioIp + "] DI[" + DILength + "] DO[" + DOLength + "],[" + DIMS + "] [" + DOMS + "]";
try
{
// Create new modbus master and add event functions
aioBox = new AIOBOX_32();
aioBox = new AIOBOX();
aioBox.SetType(Box_Type.DI, DILength, Box_Type.DO, DOLength);
//aioBox.LogPath(Application.StartupPath + @"\logs\aio\", LogType.OnlyError);
aioBox.IP = ioIp;
DefaultIP = ioIp;
LogUtil.info("开始连接IO模块【" + ioIp + "】,尝试重连三次");
for (int i = 1; i <= 3; i++)
{
bool result = aioBox.Connect();
if (result)
{
AIOMap.Add(ioIp, aioBox);
LogUtil.info("第【"+i+"】次连接IO模块【" + ioIp + "】成功:" + aioBox.ErrInfo);
aioBox.AutoReadDI = true;
aioBox.AutoReadDO = true;
aioBox.DI_Changed_Event += AioBox_DI_Changed_Event; ;
aioBox.DO_Changed_Event += AioBox_DO_Changed_Event;
Thread.Sleep(10);
//读取所有的DO
ReadAllDI(ioIp, 0);
break;
}
else
{
LogUtil.error("第【" + i + "】次连接IO模块【" + ioIp + "】失败:" + aioBox.ErrInfo + "");
}
Thread.Sleep(10);
}
// bool rtn = aioBox.AutoIP(ioIp);
// aioBox.SetInput(Asa.IOModule.Box_Type.DI, DILength);
// aioBox.SetOutput(Asa.IOModule.Box_Type.DO, DOLength);
//DI主动上传
// aioBox.AutoReadInput(true, DIMS);
// aioBox.AutoReadOutput(false, DOMS);
aioBox.DI_Changed_Event += AioBox_DI_Changed_Event; ;
aioBox.DO_Changed_Event += AioBox_DO_Changed_Event;
bool conRes = aioBox.Connect();
LogUtil.info("开始连接:" + logName + ":" + conRes.ToString());
AIOMap.Add(ioIp, aioBox);
Thread.Sleep(5);
//读取所有的DO
ReadAllDI(ioIp, 0);
Thread.Sleep(5);
GC.Collect();
}
catch (Exception error)
{
LogUtil.error(LOGGER, "连接IO模块[" + ioIp + "]出错:" + error.ToString());
LogUtil.error( "连接IO模块 " + logName + " 出错:" + error.ToString());
}
}
private DateTime lastLogTime = DateTime.Now;
private void AioBox_Log_Out_Event(AIOBOX box, string[] s)
{
foreach (string str in s)
{
LogUtil.debug("[" + box.IP + "]" + str);
}
}
private void AioBox_DI_Changed_Event(AIOBOX_32 box, Status[] sta)
private void AioBox_DI_Changed_Event(AIOBOX box, Box_Sta[] sta)
{
try
{
UpdateAllDI(box.IP, sta);
//LogUtil.info("ReadAllDI [" + box.IP + "]:" + string.Join(" ", sta));
}
catch (Exception ex)
{
LogUtil.error("AioBox_DI_Changed_Event出错:" + ex.ToString());
}
}
private void AioBox_DO_Changed_Event(AIOBOX_32 box, Status[] sta)
private void AioBox_DO_Changed_Event(AIOBOX box, Box_Sta[] sta)
{
try
{
UpdateAllDO(box.IP, sta);
}
catch (Exception ex)
......@@ -113,14 +158,15 @@ namespace TSA_V.DeviceLibrary
}
}
private void UpdateAllDI(string ip, Status[] sta)
private void UpdateAllDI(string ip, Box_Sta[] sta)
{
if (sta != null && sta.Length >= DefaultDILength)
{
string updateDi = "[" + ip + "]:";
bool needUpdate = false;
List<Status> newList = new List<Status>();
List<Box_Sta> newList = new List<Box_Sta>();
newList.AddRange(sta);
List<Status> oldList = null;
List<Box_Sta> oldList = null;
DIValueMap.TryGetValue(ip, out oldList);
if (oldList == null || oldList.Count.Equals(newList.Count).Equals(false))
{
......@@ -148,17 +194,24 @@ namespace TSA_V.DeviceLibrary
DIValueMap.Add(ip, newList);
}
}
}
}
}
private void UpdateAllDO(string ip, Status[] sta)
private void UpdateAllDO(string ip, Box_Sta[] sta)
{
if (sta != null && sta.Length >= DefaultDOLength)
{
bool needUpdate = false;
List<Status> newList = new List<Status>();
List<Box_Sta> newList = new List<Box_Sta>();
newList.AddRange(sta);
List<Status> oldList = null;
List<Box_Sta> oldList = null;
DOValueMap.TryGetValue(ip, out oldList);
//string result = "UpdateAllDO ip[" + ip + "], sta :";
//for (int i = 0; i < newList.Count; i++)
//{
// result += newList[i] + ",";
//}
//LogUtil.info(result);
if (oldList == null || oldList.Count.Equals(newList.Count).Equals(false))
{
needUpdate = true;
......@@ -187,56 +240,34 @@ namespace TSA_V.DeviceLibrary
}
}
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
List<string> list = new List<string>(AIOMap.Keys);
foreach (string io in list)
{
//判断是否连接,如果没有连接自动重连
AIOBOX_32 clinet = AIOMap[io];
if (!clinet.IsConn)
{
LogUtil.error(LOGGER, io + "当前没有连上:" + clinet.ErrInfo);
}
}
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "出错啦:" + ex.ToString());
}
Thread.Sleep(1);
}
public override void ConnectionKND(List<string> DIONameList)
{
foreach (string ip in DIONameList)
{
ConnectionIP(ip,0 );
}
}
//关闭所有的DO
public override void CloseAllDO()
{
foreach (AIOBOX_32 aio in AIOMap.Values)
{
Status[] statuses = new Status[16];
for(int i = 0; i < 16; i++)
{
foreach (AIOBOX aio in AIOMap.Values)
{
ushort length = DefaultDOLength;
for (ushort i = 0; i < length; i++)
{
statuses[i] = Status.Off;
aio.WriteDO(i, Box_Sta.Off);
}
aio.WriteDO(Addr.DI_1, statuses);
}
}
}
public override void CloseAllConnection()
{
foreach (AIOBOX_32 aio in AIOMap.Values)
foreach (AIOBOX aio in AIOMap.Values)
{
aio.Close();
try
{
aio.Close();
}
catch (Exception ex)
{
LogUtil.error("aio.Close出错:" + ex.ToString());
}
}
AIOMap.Clear();
}
......@@ -245,45 +276,34 @@ namespace TSA_V.DeviceLibrary
try
{
AIOBOX_32 aioBox = getAIO(ioIp);
AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null)
{
Addr add = GetAddr(StartAddress);
for (int i = 1; i <= 3; i++)
bool result = aioBox.WriteDO(StartAddress, GetBox_Sta(onOff));
if (!result)
{
bool result = aioBox.WriteDO(GetAddr(StartAddress), GetStatus(onOff));
if (!result)
{
LogUtil.error("AIO WriteSingleDO [" + StartAddress + "] 第" + i + "次失败:" + aioBox.ErrInfo);
}
else
{
break;
}
LogUtil.error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 失败:");
}
}
else
{
LogUtil.error(LOGGER, "ReadSingleDO出错没有连接IO模块:" + ioIp);
LogUtil.error( "WriteSingleDO出错 没有连接IO模块:" + ioIp);
}
}
catch (Exception ex)
{
LOGGER.Error("出错啦:" + ex.ToString());
}
Common.LogUtil.error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错啦:" + ex.ToString());
}
}
public override void WriteSingleDO(string ioIp, byte slaveId, ushort StartAddress, IO_VALUE onOff, int mSeconds)
{
try
{
AIOBOX_32 aioBox = getAIO(ioIp);
Status currStatus = GetStatus(onOff);
AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null)
{
Addr add = GetAddr(StartAddress);
aioBox.WriteDO(GetAddr(StartAddress), currStatus);
Box_Sta currBox_Sta = GetBox_Sta(onOff);
aioBox.WriteDO(StartAddress, currBox_Sta);
//写入之后,等待指定间隔后回写
System.Timers.Timer mytimer = new System.Timers.Timer(mSeconds);
......@@ -291,71 +311,59 @@ namespace TSA_V.DeviceLibrary
{
try
{
aioBox.WriteDO(GetAddr(StartAddress), aioBox.ReverseStatus(currStatus));
LogUtil.debug(LOGGER, "**********定时回写入 IO【" + ioIp + "," + StartAddress + ",值" + aioBox.ReverseStatus(currStatus) + "】:");
aioBox.WriteDO(StartAddress, aioBox.ReverseStatus(currBox_Sta));
LogUtil.debug( "**********定时回写入 IO [" + ioIp + "] [" + StartAddress + "]值" + aioBox.ReverseStatus(currBox_Sta) + "】:");
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "**********定时回写入 出错:" + ex.StackTrace);
LogUtil.error( "**********定时回写入 出错:" + ex.StackTrace);
}
};
mytimer.AutoReset = false;//设置是否自动重启,即自动执行多次;
mytimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件mytask;
}
else
{
LogUtil.error(LOGGER, "WriteSingleDO出错没有连接IO模块:" + ioIp);
LogUtil.error( "AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错 没有连接IO模块:" + ioIp);
}
}
catch (Exception ex)
{
LogUtil.error("WriteSingleDO出错:" + ioIp);
LogUtil.error("AIO WriteSingleDO [" + ioIp + "] [" + StartAddress + "] 出错:" + ioIp);
}
}
public override void ReadAllDI(string ioIp, byte slaveId)
{
try
{
AIOBOX_32 aioBox = getAIO(ioIp);
AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null)
{
Status[] allDi;
if (aioBox.ReadDI(Addr.DI_1, DefaultDILength, out allDi))
{
UpdateAllDI(ioIp, allDi);
}
else
{
LogUtil.error("读取所有DI出错:" + aioBox.ErrInfo);
}
Box_Sta[] allDi = aioBox.ReadDI(0, DefaultDILength);
UpdateAllDI(ioIp, allDi);
}
}
catch (Exception ex)
{
LogUtil.error("ReadAllDI出错:" + ioIp);
LogUtil.error("ReadAllDI [" + ioIp + "]出错:" + ioIp);
}
}
public override void ReadAllDO(string ioIp, byte slaveId)
{
try
{
AIOBOX_32 aioBox = getAIO(ioIp);
AIOBOX aioBox = getAIO(ioIp);
if (aioBox != null)
{
Status[] allDO;
if (aioBox.ReadDO(Addr.DO_1, DefaultDOLength, out allDO))
{
UpdateAllDO(ioIp, allDO);
}
else
{
LogUtil.error("读取所有DO出错:" + aioBox.ErrInfo);
}
// int startIndex = StoreManager.Config.GetDILength(ioIp);
Box_Sta[] allDO = aioBox.ReadDO(0, DefaultDOLength);
UpdateAllDO(ioIp, allDO);
}
}
catch (Exception ex)
{
LogUtil.error("ReadAllDO出错:" + ioIp);
LogUtil.error("ReadAllDO [" + ioIp + "]出错:" + ioIp);
}
}
public override IO_VALUE GetDOValue(string ioIP, byte slaveId, ushort StartAddress)
......@@ -363,19 +371,17 @@ namespace TSA_V.DeviceLibrary
IO_VALUE value = IO_VALUE.LOW;
try
{
AIOBOX_32 aioBox = getAIO(ioIP);
AIOBOX aioBox = getAIO(ioIP);
if (aioBox != null)
{
Status status = Status.Off;
Addr addr = GetAddr(StartAddress);
int index =(int)StartAddress - (int)DefaultDILength;
if (DOValueMap.ContainsKey(ioIP) && DOValueMap[ioIP].Count>index)
Box_Sta sta = Box_Sta.Off;
if (DOValueMap.ContainsKey(ioIP) && DOValueMap[ioIP].Count > StartAddress)
{
status = DOValueMap[ioIP][index];
sta = DOValueMap[ioIP][StartAddress];
}
else
{ aioBox.ReadDO(addr, out status); }
if (status.Equals(Status.On))
{ sta = aioBox.ReadDO(StartAddress); }
if (sta.Equals(Box_Sta.On))
{
value = IO_VALUE.HIGH;
}
......@@ -383,7 +389,7 @@ namespace TSA_V.DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error("ReadDI 出错:" + ex.ToString());
LogUtil.error("GetDOValue [" + ioIP + "] [" + StartAddress + "] 出错:" + ex.ToString());
}
return value;
}
......@@ -391,31 +397,34 @@ namespace TSA_V.DeviceLibrary
public override IO_VALUE GetDIValue(string ioIP, byte slaveId, ushort StartAddress)
{
IO_VALUE value = IO_VALUE.LOW;
try
for (int i = 1; i <= 3; i++)
{
AIOBOX_32 aioBox = getAIO(ioIP);
if (aioBox != null)
try
{
Status status = Status.Off;
Addr addr = GetAddr(StartAddress);
int index = StartAddress;
if (DIValueMap.ContainsKey(ioIP) && DIValueMap[ioIP].Count> index)
{
status = DIValueMap[ioIP][index];
}
else
AIOBOX aioBox = getAIO(ioIP);
if (aioBox != null)
{
aioBox.ReadDI(addr, out status);
}
if (status.Equals(Status.On))
{
value = IO_VALUE.HIGH;
Box_Sta sta = Box_Sta.Off;
// Box_Addr addr = GetAddr(StartAddress);
int index = StartAddress;
if (DIValueMap.ContainsKey(ioIP) && DIValueMap[ioIP].Count > index)
{
sta = DIValueMap[ioIP][index];
}
else
{
sta = aioBox.ReadDI(StartAddress);
}
if (sta.Equals(Box_Sta.On))
{
value = IO_VALUE.HIGH;
}
}
}
}
catch (Exception ex)
{
LogUtil.error("GetDIValue 出错:" + ex.ToString());
catch (Exception ex)
{
LogUtil.error("GetDIValue [" + ioIP + "] [" + StartAddress + "] ["+i+"] 出错:" + ex.ToString());
}
}
return value;
}
......@@ -435,30 +444,26 @@ namespace TSA_V.DeviceLibrary
}
catch (Exception ex)
{
LogUtil.error(LOGGER, "GetIOValue获取数据出错:" + ex.ToString());
LogUtil.error( " GetIOValue [" + configIO.DeviceName + "] [" + configIO.IOIndex + "] 获取数据出错:" + ex.ToString());
}
return value;
}
private Addr GetAddr(ushort StartAddress)
{
return (Addr)(StartAddress );
}
private Status GetStatus(IO_VALUE onOff)
private Box_Sta GetBox_Sta(IO_VALUE onOff)
{
if (onOff.Equals(IO_VALUE.HIGH))
{
return Status.On;
return Box_Sta.On;
}
else
{
return Status.Off;
return Box_Sta.Off;
}
}
private AIOBOX_32 getAIO(string ioIp)
private AIOBOX getAIO(string ioIp)
{
AIOBOX_32 aioBox = null;
AIOBOX aioBox = null;
if (AIOMap.ContainsKey(ioIp))
{
aioBox = AIOMap[ioIp];
......@@ -466,13 +471,28 @@ namespace TSA_V.DeviceLibrary
return aioBox;
}
public override void ConnectionKND(List<string> dIODeviceNameList)
{
foreach (string ip in dIODeviceNameList)
{
ConnectionIP(ip);
}
}
public override void ConnectionIP(string kNDIP, ushort kNDPort)
{
ConnectionIP(kNDIP);
}
public override bool IsConnection(string kNDIP)
{
AIOBOX_32 aioBox = getAIO(kNDIP);
if (aioBox != null)
AIOBOX aioBox = getAIO(kNDIP);
if (aioBox != null && aioBox.IsConn)
{
return aioBox.IsConn;
}return false;
return true;
}
return false;
}
}
}
}
\ No newline at end of file
此文件类型无法预览
<?xml version="1.0"?>
<doc>
<assembly>
<name>AIOBOX</name>
</assembly>
<members>
<member name="T:Asa.AIOBOX.AIOBOX_32">
<summary>
AIOBOX-32
</summary>
</member>
<member name="T:Asa.AIOBOX.AIOBOX_32.DI_Changed">
<summary>
自动读取DI委托
</summary>
<param name="box">AIOBOX</param>
<param name="sta">所有DI状态</param>
</member>
<member name="E:Asa.AIOBOX.AIOBOX_32.DI_Changed_Event">
<summary>
自动读取DI事件触发
</summary>
</member>
<member name="T:Asa.AIOBOX.AIOBOX_32.DO_Changed">
<summary>
自动读取DO委托
</summary>
<param name="box">AIOBOX</param>
<param name="sta">所有DO状态</param>
</member>
<member name="E:Asa.AIOBOX.AIOBOX_32.DO_Changed_Event">
<summary>
自动读取DO事件触发
</summary>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.#ctor">
<summary>
AIOBOX-32
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.IP">
<summary>
IP地址
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.Mask">
<summary>
子网掩码
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.Gateway">
<summary>
子网网关
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.Port">
<summary>
ModBus端口
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.IsConn">
<summary>
是否连接
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.ErrInfo">
<summary>
错误信息
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.AutoReadDI">
<summary>
自动读取DI状态,触发DI_Changed_Event
</summary>
</member>
<member name="P:Asa.AIOBOX.AIOBOX_32.AutoReadDO">
<summary>
自动读取DO状态,触发DO_Changed_Event
</summary>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.Connect">
<summary>
连接
</summary>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.Close">
<summary>
关闭连接
</summary>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.ReverseStatus(Asa.AIOBOX.Status)">
<summary>
相反状态
</summary>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.WriteDO(Asa.AIOBOX.Addr,Asa.AIOBOX.Status)">
<summary>
写入单个DO
</summary>
<param name="add"></param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.WriteDO_Reverse(Asa.AIOBOX.Addr,Asa.AIOBOX.Status@)">
<summary>
先把状态取反,然后写入单个DO
</summary>
<param name="add"></param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.WriteDO(Asa.AIOBOX.Addr,Asa.AIOBOX.Status[])">
<summary>
写入多个DO
</summary>
<param name="add"></param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.ReadDO(Asa.AIOBOX.Addr,Asa.AIOBOX.Status@)">
<summary>
读取单个DO
</summary>
<param name="add"></param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.ReadDO(Asa.AIOBOX.Addr,System.UInt32,Asa.AIOBOX.Status[]@)">
<summary>
读取多个DO
</summary>
<param name="add">起始地址</param>
<param name="count">数量</param>
<param name="sta">状态</param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.ReadDI(Asa.AIOBOX.Addr,Asa.AIOBOX.Status@)">
<summary>
读取单个DI
</summary>
<param name="add"></param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.ReadDI(Asa.AIOBOX.Addr,System.UInt32,Asa.AIOBOX.Status[]@)">
<summary>
读取多个DI
</summary>
<param name="add"></param>
<param name="count"></param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.Command(System.Byte[]@)">
<summary>
命令,前7个字节
</summary>
<param name="data"></param>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.Target(System.IAsyncResult)">
<summary>
回调函数,开启监听线程
</summary>
<param name="args"></param>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.Listen">
<summary>
监听结果线程,把读取到的数据保存到buff
</summary>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.Auto_Read_DIO">
<summary>
自动读取DIO线程
</summary>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.Trigger_DIO">
<summary>
触发DIO改变事件
</summary>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.ReadDI">
<summary>
读取所有DI状态
</summary>
<returns></returns>
</member>
<member name="M:Asa.AIOBOX.AIOBOX_32.ReadDO">
<summary>
读取所有DO状态
</summary>
<returns></returns>
</member>
<member name="T:Asa.AIOBOX.Reg">
<summary>
寄存器
</summary>
</member>
<member name="F:Asa.AIOBOX.Reg.ID">
<summary>
标识
</summary>
</member>
<member name="F:Asa.AIOBOX.Reg.Text">
<summary>
显示文本
</summary>
</member>
<member name="F:Asa.AIOBOX.Reg.Addr">
<summary>
寄存器地址
</summary>
</member>
<member name="F:Asa.AIOBOX.Reg.Status">
<summary>
当前的状态
</summary>
</member>
<member name="M:Asa.AIOBOX.Reg.#ctor(Asa.AIOBOX.Addr)">
<summary>
寄存器,文本空,状态OFF
</summary>
<param name="address">地址</param>
</member>
<member name="M:Asa.AIOBOX.Reg.#ctor(System.String,Asa.AIOBOX.Addr)">
<summary>
寄存器,状态OFF
</summary>
<param name="text">文本</param>
<param name="addr">地址</param>
</member>
<member name="M:Asa.AIOBOX.Reg.#ctor(System.Int32,System.String,Asa.AIOBOX.Addr)">
<summary>
寄存器,状态OFF
</summary>
<param name="id">标志</param>
<param name="text">文本</param>
<param name="addr">地址</param>
</member>
<member name="M:Asa.AIOBOX.Reg.#ctor(System.String,Asa.AIOBOX.Addr,Asa.AIOBOX.Status)">
<summary>
寄存器
</summary>
<param name="text">文本</param>
<param name="addr">地址</param>
<param name="status">状态</param>
</member>
<member name="M:Asa.AIOBOX.Reg.#ctor(System.Int32,System.String,Asa.AIOBOX.Addr,Asa.AIOBOX.Status)">
<summary>
寄存器
</summary>
<param name="id">标志</param>
<param name="text">文本</param>
<param name="address">地址</param>
<param name="status">状态</param>
</member>
<member name="T:Asa.AIOBOX.Addr">
<summary>
寄存器地址
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_1">
<summary>
输入点,A1
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_2">
<summary>
输入点,A2
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_3">
<summary>
输入点,A3
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_4">
<summary>
输入点,A4
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_5">
<summary>
输入点,A5
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_6">
<summary>
输入点,A6
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_7">
<summary>
输入点,A7
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_8">
<summary>
输入点,A8
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_9">
<summary>
输入点,A9
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_10">
<summary>
输入点,A10
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_11">
<summary>
输入点,A11
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_12">
<summary>
输入点,A12
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_13">
<summary>
输入点,A13
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_14">
<summary>
输入点,A14
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_15">
<summary>
输入点,A15
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DI_16">
<summary>
输入点,A16
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_1">
<summary>
输出点,B1
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_2">
<summary>
输出点,B2
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_3">
<summary>
输出点,B3
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_4">
<summary>
输出点,B4
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_5">
<summary>
输出点,B5
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_6">
<summary>
输出点,B6
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_7">
<summary>
输出点,B7
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_8">
<summary>
输出点,B8
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_9">
<summary>
输出点,B9
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_10">
<summary>
输出点,B10
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_11">
<summary>
输出点,B11
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_12">
<summary>
输出点,B12
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_13">
<summary>
输出点,B13
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_14">
<summary>
输出点,B14
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_15">
<summary>
输出点,B15
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.DO_16">
<summary>
输出点,B16
</summary>
</member>
<member name="F:Asa.AIOBOX.Addr.NONE">
<summary>
</summary>
</member>
<member name="T:Asa.AIOBOX.Status">
<summary>
寄存器状态
</summary>
</member>
<member name="F:Asa.AIOBOX.Status.Off">
<summary>
断开,关闭,低电平
</summary>
</member>
<member name="F:Asa.AIOBOX.Status.On">
<summary>
闭合,打开,高电平
</summary>
</member>
</members>
</doc>
此文件类型无法预览
<?xml version="1.0"?>
<doc>
<assembly>
<name>Asa.IOModule.AIOBOX</name>
</assembly>
<members>
<member name="T:Asa.IOModule.AIOBOX">
<summary>
零点IO模块操作类
</summary>
</member>
<member name="T:Asa.IOModule.AIOBOX.DIO_Changed">
<summary>
自动读取DI委托
</summary>
<param name="box">AIOBOX</param>
<param name="sta">所有DI状态</param>
</member>
<member name="E:Asa.IOModule.AIOBOX.DI_Changed_Event">
<summary>
自动读取DI事件触发
</summary>
</member>
<member name="E:Asa.IOModule.AIOBOX.DO_Changed_Event">
<summary>
自动读取DO事件触发
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.#ctor(System.String)">
<summary>
零点IO模块操作类
</summary>
<param name="logName"></param>
</member>
<member name="P:Asa.IOModule.AIOBOX.IP">
<summary>
IP地址
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.Upload">
<summary>
输入主动上传
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.IsConn">
<summary>
是否连接
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.InputCount">
<summary>
DI总数
</summary>
</member>
<member name="P:Asa.IOModule.AIOBOX.OutputCount">
<summary>
DO总数
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.SetType(Asa.IOModule.Box_Type,System.Int32,Asa.IOModule.Box_Type,System.Int32)">
<summary>
设置输入输出的类型
</summary>
<param name="input"></param>
<param name="inputCount"></param>
<param name="output"></param>
<param name="outputCount"></param>
</member>
<member name="M:Asa.IOModule.AIOBOX.Connect">
<summary>
连接
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.Close">
<summary>
关闭连接
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta)">
<summary>
相反状态(ON/OFF)
</summary>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReverseStatus(Asa.IOModule.Box_Sta@)">
<summary>
相反状态(ON/OFF)
</summary>
<param name="sta"></param>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Int32)">
<summary>
读取单个DI输入状态(ON/OFF)
</summary>
<param name="add">输入地址,从0开始</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDI(System.Int32,System.Int32)">
<summary>
读取多个DI输入状态(ON/OFF)
</summary>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadAI(System.Int32)">
<summary>
读取单个AI模拟量的值
</summary>
<param name="add">模拟量地址,从0开始</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadAI(System.Int32,System.Int32)">
<summary>
读取多个AI模拟量的值
</summary>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Int32)">
<summary>
读取单个DO输出状态(ON/OFF)
</summary>
<param name="add">输出地址,从0开始</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadDO(System.Int32,System.Int32)">
<summary>
读取多个DO输出状态(ON/OFF)
</summary>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadAO(System.Int32)">
<summary>
读取单个AO模拟量的值
</summary>
<param name="add">输出地址,从0开始</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.ReadAO(System.Int32,System.Int32)">
<summary>
读取多个AO模拟量的值
</summary>
<param name="add">起始地址,从0开始</param>
<param name="count">数量</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.WriteDO(System.Int32,Asa.IOModule.Box_Sta)">
<summary>
写入单个DO输出状态(ON/OFF)
</summary>
<param name="add">输出地址,从0开始</param>
<param name="sta"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.GetLocalIP">
<summary>
获取本地IPv4地址
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.Send">
<summary>
发送命令线程
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.GetReadDI_Command">
<summary>
获取ReadDI的命令
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.GetReadDO_Command">
<summary>
获取ReadDO的命令
</summary>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.Listen">
<summary>
监听网络线程
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.CommandProcess(System.Byte[])">
<summary>
接收到的命令处理方法,(task多线程)
</summary>
<param name="cmd"></param>
</member>
<member name="M:Asa.IOModule.AIOBOX.Reconn">
<summary>
重连线程
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.Open">
<summary>
打开socket建立连接
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.CheckIP(System.String)">
<summary>
检查IP地址
</summary>
<param name="ip"></param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.AutoIP(System.String)">
<summary>
自动获取IP地址,未连接前使用,必须在同一网段
</summary>
<param name="localIP">本地IP地址</param>
<returns></returns>
</member>
<member name="M:Asa.IOModule.AIOBOX.GetIP">
<summary>
获取IO模块IP地址
</summary>
</member>
<member name="M:Asa.IOModule.AIOBOX.Command">
<summary>
命令,前7个字节
</summary>
<returns></returns>
</member>
<member name="T:Asa.IOModule.Box_Type">
<summary>
IO模块类型
</summary>
</member>
<member name="F:Asa.IOModule.Box_Type.DI">
<summary>
数字信号输入
</summary>
</member>
<member name="F:Asa.IOModule.Box_Type.DO">
<summary>
数字信号输出
</summary>
</member>
<member name="F:Asa.IOModule.Box_Type.AI">
<summary>
模拟量输入
</summary>
</member>
<member name="F:Asa.IOModule.Box_Type.AO">
<summary>
模拟量输出
</summary>
</member>
<member name="T:Asa.IOModule.Box_Sta">
<summary>
IO模块寄存器状态
</summary>
</member>
<member name="F:Asa.IOModule.Box_Sta.Off">
<summary>
断开,关闭,低电平
</summary>
</member>
<member name="F:Asa.IOModule.Box_Sta.On">
<summary>
闭合,打开,高电平
</summary>
</member>
</members>
</doc>
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!