using GTN; 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 ioList = new List(); Dictionary ioDic = new Dictionary(); private List ioCards = new List(); private IoManager() { } private static IoManager instance; public static IoManager Instance { get { if(instance==null) instance = new IoManager(); return instance; } } public List 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(filename, cardIn2); } else XmlSerializerHelper.Instance.Deserialize(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(filename, card1); } else XmlSerializerHelper.Instance.Deserialize(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(filename, card1); } else XmlSerializerHelper.Instance.Deserialize(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(filename, card1); } else XmlSerializerHelper.Instance.Deserialize(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(filename, card1); } else XmlSerializerHelper.Instance.Deserialize(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(filename, card1); } else XmlSerializerHelper.Instance.Deserialize(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.Init(16, 16, 0); bool suc = XmlSerializerHelper.Instance.Serialize(filename, iocard); } else XmlSerializerHelper.Instance.Deserialize(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.Vender=="Gugao"&&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 if(io.Card.Vender == "Gugao" && !io.Card.IsEtherCat) { 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; } } } return -1; } public short ReadOut(string name) { if (ioDic.ContainsKey(name)) { IIO io = ioDic[name]; if (io.Card.Vender == "Gugao" && 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 if (io.Card.Vender == "Gugao" && !io.Card.IsEtherCat) { 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; } } } 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.Vender=="Gugao" && 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 if (io.Card.Vender == "Gugao" && !io.Card.IsEtherCat) { GLinkIO gio = (GLinkIO)io; mc_ecat.GTN_SetDoBit(1, mc_ecat.MC_GPO, (short)(gio.Index+1), value); } } return -1; } } }