You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
11 KiB
C#

using GTN;
using gts;
using Rs.Framework;
using Rs.Motion.GugaoEcat;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Rs.Motion
{
public class IoManager
{
private short apiResult = 0;
List<IIO> ioList = new List<IIO>();
Dictionary<string, IIO> ioDic = new Dictionary<string, IIO>();
private List<IIOCard> ioCards = new List<IIOCard>();
private IoManager() { }
private static IoManager instance;
public static IoManager Instance
{
get
{
if(instance==null)
instance = new IoManager();
return instance;
}
}
public List<IIOCard> GetCards()
{
return ioCards;
}
public void Init()
{
ECatIOCard card1 = null;
ECatIOCard cardIn2= null;
////第一张卡
string filename = "config/motion/io/ecatio_5_32_0.xml";
//if (!File.Exists(filename))
//{
// cardIn2 = new ECatIOCard();
// cardIn2.Name = "EC4-3200A(1号卡)";
// cardIn2.Init(32, 0, 5);
// bool suc = XmlSerializerHelper.Instance.Serialize<ECatIOCard>(filename, cardIn2);
//}
//else
// XmlSerializerHelper.Instance.Deserialize<ECatIOCard>(filename, out cardIn2);
//if (cardIn2 != null)
//{
// cardIn2.Vender = "Gugao";
// ioCards.Add(cardIn2);
// Add(cardIn2);
//}
////第二张卡
// filename = "config/motion/io/ecatio_6_0_32.xml";
//if (!File.Exists(filename))
//{
// card1 = new ECatIOCard();
// card1.Name = "EC4-3200A(1号卡)";
// card1.Init(0, 32, 6);
// bool suc = XmlSerializerHelper.Instance.Serialize<ECatIOCard>(filename, card1);
//}
//else
// XmlSerializerHelper.Instance.Deserialize<ECatIOCard>(filename, out card1);
//if (card1 != null)
//{
// card1.Vender = "Gugao";
// ioCards.Add(card1);
// Add(card1);
//}
////第三张卡
//filename = "config/motion/io/ecatio_7_16_16.xml";
//if (!File.Exists(filename))
//{
// card1 = new ECatIOCard();
// card1.Name = "EC4-1616(3号卡)";
// card1.Init(16, 16, 7);
// bool suc = XmlSerializerHelper.Instance.Serialize<ECatIOCard>(filename, card1);
//}
//else
// XmlSerializerHelper.Instance.Deserialize<ECatIOCard>(filename, out card1);
//if (card1 != null)
//{
// card1.Vender = "Gugao";
// ioCards.Add(card1);
// Add(card1);
//}
////第四张卡
//filename = "config/motion/io/ecatio_8_32_0.xml";
//if (!File.Exists(filename))
//{
// card1 = new ECatIOCard();
// card1.Name = "EC4-3200A(4号卡)";
// card1.Init(32, 0, 8);
// bool suc = XmlSerializerHelper.Instance.Serialize<ECatIOCard>(filename, card1);
//}
//else
// XmlSerializerHelper.Instance.Deserialize<ECatIOCard>(filename, out card1);
//if (card1 != null)
//{
// card1.Vender = "Gugao";
// ioCards.Add(card1);
// Add(card1);
//}
////第五张卡
//filename = "config/motion/io/ecatio_9_0_32.xml";
//if (!File.Exists(filename))
//{
// card1 = new ECatIOCard();
// card1.Name = "EC4-0032(5号卡)";
// card1.Init(0, 32, 9);
// bool suc = XmlSerializerHelper.Instance.Serialize<ECatIOCard>(filename, card1);
//}
//else
// XmlSerializerHelper.Instance.Deserialize<ECatIOCard>(filename, out card1);
//if (card1 != null)
//{
// card1.Vender = "Gugao";
// ioCards.Add(card1);
// Add(card1);
//}
////第六张卡
//filename = "config/motion/io/ecatio_10_16_16.xml";
//if (!File.Exists(filename))
//{
// card1 = new ECatIOCard();
// card1.Name = "EC4-1616(6号卡)";
// card1.Init(16, 16, 10);
// bool suc = XmlSerializerHelper.Instance.Serialize<ECatIOCard>(filename, card1);
//}
//else
// XmlSerializerHelper.Instance.Deserialize<ECatIOCard>(filename, out card1);
//if (card1 != null)
//{
// card1.Vender = "Gugao";
// ioCards.Add(card1);
// Add(card1);
//}
GLinkIOCard iocard = null;
filename = "config/motion/io/glinkio.xml";
if (!File.Exists(filename))
{
iocard = new GLinkIOCard();
iocard.Name = "GLink0";
iocard.CardType = 0;
iocard.IsEtherCat = false;
iocard.Init(16, 16, 0);
bool suc = XmlSerializerHelper.Instance.Serialize<GLinkIOCard>(filename, iocard);
}
else
XmlSerializerHelper.Instance.Deserialize<GLinkIOCard>(filename, out iocard);
if (iocard != null)
{
iocard.Vender = "Gugao";
ioCards.Add(iocard);
//foreach (var item in iocard.DIn)
//{
// item.IsReverse = false;
//}
//foreach (var item in iocard.DOut)
//{
// item.IsReverse = true;
//}
Add(iocard);
}
}
void Add(IIOCard card)
{
foreach (IIO eCatIO in card.DOut)
{
eCatIO.Card = card;
if (ioDic.ContainsKey(eCatIO.Name))
continue;
ioDic.Add(eCatIO.Name, eCatIO);
}
foreach (IIO eCatIO in card.DIn)
{
eCatIO.Card = card;
ioDic.Add(eCatIO.Name, eCatIO);
}
}
public short ReadIn(string name)
{
if(ioDic.ContainsKey(name))
{
IIO io = ioDic[name];
if(io.Card.CardType==1)//总线
{
if(io.Card.IsEtherCat)
{
ECatIO eio = (ECatIO)io;
apiResult = mc_ecat.GTN_EcatIOBitReadInput(eio.Core, eio.SlaveNo, eio.Offset, eio.Index, out byte pValue);
if (apiResult == 0)
return pValue;
}
else
{
GLinkIO eio = (GLinkIO)io;
apiResult = mc_ecat.GTN_GetDi(1, mc_ecat.MC_GPI, out Int32 value);
if (apiResult == 0)
{
byte pValue = (byte)(~(value >> eio.Index) & 0x01);
return pValue;
}
}
}
else
{
GLinkIO eio = (GLinkIO)io;
apiResult = mc_pulse.GT_GetDi((short)io.CardID,mc_pulse.MC_GPI, out int value);
if (apiResult == 0)
{
byte pValue = (byte)(~(value >> eio.Index) & 0x01);
return pValue;
}
}
}
return -1;
}
public short ReadOut(string name)
{
if (ioDic.ContainsKey(name))
{
IIO io = ioDic[name];
if (io.Card.CardType==1)
{
if(io.Card.IsEtherCat)
{
ECatIO eio = (ECatIO)io;
apiResult = mc_ecat.GTN_EcatIOBitReadOutput(eio.Core, eio.SlaveNo, eio.Offset, eio.Index, out byte pValue);
if (apiResult == 0)
return pValue;
}
else
{
GLinkIO eio = (GLinkIO)io;
apiResult = mc_ecat.GTN_GetDo(1, mc_ecat.MC_GPO, out Int32 value);
if (apiResult == 0)
{
byte pValue = (byte)(~(value >> eio.Index) & 0x01);
return pValue;
}
}
}
else if (io.Card.Vender == "Gugao" && !io.Card.IsEtherCat)
{
GLinkIO eio = (GLinkIO)io;
apiResult = mc_pulse.GT_GetDo(io.CardID, mc_pulse.MC_GPO, out Int32 value);
if (apiResult == 0)
{
byte pValue = (byte)(~(value >> eio.Index) & 0x01);
return pValue;
}
}
}
return -1;
}
public short WriteOut(string name,byte value)
{
//mc_ecat.GTN_SetDoBit(1, mc_ecat.MC_GPO, 1, 0);
//mc_ecat.GTN_GetDo(1, mc_ecat.MC_GPO, out Int32 aaa);
//mc_ecat.GTN_GetDi(1, mc_ecat.MC_GPI, out int ppp);
if (ioDic.ContainsKey(name))
{
IIO io = ioDic[name];
if(io.IsReverse)
{
value = (byte)(~(value & 0x01) & 0x01);//取反最后一位
}
if(io.Card.CardType==1)
{
if(io.Card.IsEtherCat)
{
ECatIO eio = (ECatIO)io;
apiResult = mc_ecat.GTN_EcatIOBitWriteOutput(eio.Core, eio.SlaveNo, eio.Offset, (short)eio.Index, value);
if (apiResult == 0)
return 0;
}
else
{
GLinkIO gio = (GLinkIO)io;
mc_ecat.GTN_SetDoBit(1, mc_ecat.MC_GPO, (short)(gio.Index + 1), value);
}
}
else if (io.Card.Vender == "Gugao" && !io.Card.IsEtherCat)
{
GLinkIO gio = (GLinkIO)io;
mc_pulse.GT_SetDoBit(gio.CardID, mc_pulse.MC_GPO, (short)(gio.Index + 1), value);
}
}
return -1;
}
}
}