123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- using OmronFinsTCP.Net;
- using System;
- using System.Collections.Generic;
- using System.Configuration;
- using System.Diagnostics;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using TFT_MelsecMcNet;
- namespace PLCTool.Common
- {
- public class FinsPLCConnection: IPLCConnection
- {
- private static string plcIp = ConfigurationManager.AppSettings["PLCIp"];
- private static string plcPort = ConfigurationManager.AppSettings["PLCPort"];
- private static EtherNetPLC ENT = new EtherNetPLC();
- private static FinsPLCConnection instance;
- private static bool isConnect=false;
-
- private FinsPLCConnection()
- {
- ConnectPLC();
- }
- public static FinsPLCConnection Instance
- {
- get
- {
- if ((!ENT.IsConnect))
- {
- instance = new FinsPLCConnection();
- }
- return instance;
- }
- }
- public async Task<bool> IsConnectPLC()
- {
-
- //return ENT.IsConnect;
- short rb;
- short reSuc=-1;
- Func<short> func = () =>
- {
- return ENT.GetBitState(PlcMemory.CIO, "3321.10", out rb);
- };
- var workTask = Task.Run(() => func.Invoke());
- //读取CIO区判断PLC连接情况
-
- reSuc = workTask.Result;
- //读取成功
- if (reSuc == 0)
- {
- return true;
- }
- return false;
-
- }
- public async Task<bool> ConnectPLC()
- {
- try
- {
- var result=await Task.Run(() =>
- ENT.Link(plcIp, short.Parse(plcPort), 500)
- );
-
- if (result == 0)
- {
- isConnect = true;
- return true;
- }
- else
- {
-
- isConnect = false;
- return false;
- }
- }
- catch (Exception e)
- {
- ENT.Close();
- return false;
- }
-
- }
- public string ReadPlcObject(string address, VarType valueType)
- {
- string value = string.Empty; ;
- short rb;
- short reSuc = -1;
- if (isConnect == false)
- {
- return string.Empty;
- }
-
- switch (valueType)
- {
- case VarType.Bit:
- try
- {
- if(address.Contains("w")|| address.Contains("W"))
- {
- string realAddr = address.Substring(1, address.Length - 1);
- reSuc = ENT.GetBitState(PlcMemory.WR, realAddr, out rb);
- //读取成功
- if (reSuc == 0)
- {
- value = rb.ToString();
- }
- }
- else
- {
- //读取CIO区
- reSuc = ENT.GetBitState(PlcMemory.CIO, address, out rb);
- //读取成功
- if (reSuc == 0)
- {
- value = rb.ToString();
- }
- }
-
- }
- catch(Exception ex)
- {
- }
- break;
- case VarType.Byte:
- break;
- case VarType.Word:
- try
- {
- reSuc = ENT.ReadWord(PlcMemory.DM, short.Parse(address), out rb);
- //读取成功
- if (reSuc == 0)
- {
- value = rb.ToString();
- }
- }
- catch (Exception ex)
- {
- }
- break;
- case VarType.DWord:
- break;
- case VarType.Int:
- break;
- case VarType.DInt:
- break;
- case VarType.Real:
- break;
- default:
- return null;
- }
- return value;
- }
- public bool WritePlcObject(string address, VarType valueType,string writeValue)
- {
- bool isSuccess=false;
-
- short reSuc = -1;
- if (isConnect == false)
- {
- return false;
- }
- try
- {
- switch (valueType)
- {
- case VarType.Bit:
-
- BitState bit = BitState.OFF;
- if (writeValue.Trim() == "1")
- {
- bit = BitState.ON;
- }
- else
- {
- if (writeValue.Trim() == "0")
- {
- bit = BitState.OFF;
- }
- }
- if (address.Contains("w") || address.Contains("W"))
- {
- string realAddr = address.Substring(1, address.Length - 1);
- reSuc = ENT.SetBitState(PlcMemory.WR, realAddr, bit);
-
- }
- else
- {
- reSuc = ENT.SetBitState(PlcMemory.CIO, address, bit);
- }
-
- //写成功
- if (reSuc == 0)
- {
- isSuccess = true;
- }
- break;
- case VarType.Byte:
- break;
- case VarType.Word:
- short wValue = Convert.ToInt16(writeValue);
- if (address.Contains("w") || address.Contains("W"))
- {
- string realAddr = address.Substring(1, address.Length - 1);
- reSuc = ENT.WriteWord(PlcMemory.WR, short.Parse(realAddr), wValue);
- }
- else
- {
- reSuc = ENT.WriteWord(PlcMemory.DM, short.Parse(address), wValue);
- }
-
- //写成功
- if (reSuc == 0)
- {
- isSuccess = true;
- }
- break;
- case VarType.DWord:
- break;
- case VarType.Int:
- break;
- case VarType.DInt:
- break;
- case VarType.Real:
- break;
- }
- }
- catch(Exception ex )
- {
- }
-
- return isSuccess;
- }
- public bool ResetPLC(string address, VarType valueType, string writeValue)
- {
- bool isSuccess = false;
- short reSuc = -1;
- if (isConnect == false)
- {
- return false;
- }
- try
- {
- switch (valueType)
- {
- case VarType.Bit:
- BitState bit = BitState.OFF;
- if (writeValue.Trim() == "1")
- {
- bit = BitState.ON;
- }
- else
- {
- if (writeValue.Trim() == "0")
- {
- bit = BitState.OFF;
- }
- }
- reSuc = ENT.SetBitState(PlcMemory.CIO, address, bit);
- //写成功
- if (reSuc == 0)
- {
- isSuccess = true;
- }
- break;
- case VarType.Byte:
- break;
- case VarType.Word:
- short wValue = Convert.ToInt16(writeValue);
- reSuc = ENT.WriteWord(PlcMemory.CIO, short.Parse(address), wValue);
- //写成功
- if (reSuc == 0)
- {
- isSuccess = true;
- }
- break;
- case VarType.DWord:
- break;
- case VarType.Int:
- break;
- case VarType.DInt:
- break;
- case VarType.Real:
- break;
- }
- }
- catch (Exception ex)
- {
- }
- return isSuccess;
- }
- private static object GetVariableValue(VarType varType, object var)
- {
- switch (varType)
- {
- case VarType.Bit:
- return (bool)var;
- case VarType.Byte:
- return (byte)var;
- case VarType.Word:
- return (ushort)var;
- case VarType.DWord:
- return (uint)var;
- case VarType.Int:
- return (short)var;
- case VarType.DInt:
- return (int)var;
- case VarType.Real:
- return (float)var;
-
- default:
- return null;
- }
- }
- }
- public enum VarType
- {
- /// <summary>
- /// Bit variable type (bool)
- /// </summary>
- Bit,
- /// <summary>
- /// Byte variable type (8 bits)
- /// </summary>
- Byte,
- /// <summary>
- /// Word variable type (16 bits, 2 bytes)
- /// </summary>
- Word,
- /// <summary>
- ///
- /// </summary>
- DWord,
- /// <summary>
- /// Int variable type (16 bits, 2 bytes)
- /// </summary>
- Int,
- /// <summary>
- /// DInt variable type (32 bits, 4 bytes)
- /// </summary>
- DInt,
- /// <summary>
- /// Real variable type (32 bits, 4 bytes)
- /// </summary>
- Real,
-
- /// <summary>
- /// Char Array / C-String variable type (variable)
- /// </summary>
- String,
-
- }
- }
|