Browse Source

update panasonic driver

pull/15/head
Gavin 9 years ago
parent
commit
6c228c5935
  1. 53
      SCADA/Program/PanasonicDriver/PanasonicSerialReader.cs
  2. BIN
      SCADA/dll/PanasonicDriver.dll

53
SCADA/Program/PanasonicDriver/PanasonicSerialReader.cs

@ -5,7 +5,6 @@ using System.ComponentModel;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.IO.Ports; using System.IO.Ports;
using System.Net;
using System.Text; using System.Text;
namespace PanasonicPLCriver namespace PanasonicPLCriver
@ -43,7 +42,7 @@ namespace PanasonicPLCriver
_server = server; _server = server;
_id = id; _id = id;
//spare1 = {COM3,9600,Odd,8,One} //spare1 = {COM3,9600,Odd,8,One}
_serialPort = new SerialPort("COM2",57600,Parity.Odd,8,StopBits.One); _serialPort = new SerialPort("COM2", 57600, Parity.Odd, 8, StopBits.One);
_devId = byte.Parse(spare2); _devId = byte.Parse(spare2);
} }
public bool IsClosed public bool IsClosed
@ -299,7 +298,7 @@ namespace PanasonicPLCriver
/// <param name="values">写入的值</param> /// <param name="values">写入的值</param>
/// <param name="respBeginStr">响应的开始帧</param> /// <param name="respBeginStr">响应的开始帧</param>
/// <returns></returns> /// <returns></returns>
public string CreateWDCmd(int start, short[] values, out string respBeginStr) public string CreateWDCmd(int start, short[] values, out string respBeginStr)
{ {
string dataStr = string.Empty; string dataStr = string.Empty;
int size = values.Length; int size = values.Length;
@ -330,17 +329,18 @@ namespace PanasonicPLCriver
{ {
if (!isBool(startAddress.Area))//读寄存器的情况 if (!isBool(startAddress.Area))//读寄存器的情况
{ {
cmd = CreateRDCmd(startAddress.Start,size,out respBeginStr); cmd = CreateRDCmd(startAddress.Start, size, out respBeginStr);
} }
else //读触点的情况 else //读触点的情况
{ {
cmd = CreateRCCCmd(startAddress.Start, size, startAddress.Area, out respBeginStr); cmd = CreateRCCCmd(startAddress.Start, size, startAddress.Area, out respBeginStr);
} }
return WriteSyncData(respBeginStr, cmd); return WriteSyncData(respBeginStr, cmd);
} }
catch (Exception e) catch (Exception e)
{ {
OnClose?.Invoke(this, new ShutdownRequestEventArgs(e.Message)); if (OnClose != null)
OnClose(this, new ShutdownRequestEventArgs(e.Message));
return null; return null;
} }
} }
@ -350,7 +350,7 @@ namespace PanasonicPLCriver
byte[] writeData = Encoding.Default.GetBytes(cmd); byte[] writeData = Encoding.Default.GetBytes(cmd);
string recv = string.Empty; string recv = string.Empty;
lock (syncLock)//这里加锁 防止一个刚写完还没全读来 另一就去写 lock (syncLock)//这里加锁 防止一个刚写完还没全读来 另一就去写
//但这就会造成锁死的情况 比如循环读的时候 触发去写 这时候必须要等读完才能去写 //但这就会造成锁死的情况 比如循环读的时候 触发去写 这时候必须要等读完才能去写
{ {
_serialPort.Write(writeData, 0, writeData.Length); _serialPort.Write(writeData, 0, writeData.Length);
try try
@ -359,14 +359,16 @@ namespace PanasonicPLCriver
} }
catch (Exception) catch (Exception)
{ {
OnClose?.Invoke(this, new ShutdownRequestEventArgs("读取超时")); if (OnClose != null)
OnClose(this, new ShutdownRequestEventArgs("读取超时"));
return null; return null;
} }
} }
if (recv.Substring(3, 1) == "!")//返回为错误代码 if (recv.Substring(3, 1) == "!")//返回为错误代码
{ {
string err = recv.Substring(4, 2); string err = recv.Substring(4, 2);
OnClose?.Invoke(this, new ShutdownRequestEventArgs(daveStrerror(err))); if (OnClose != null)
OnClose(this, new ShutdownRequestEventArgs(daveStrerror(err)));
return null; return null;
} }
string needXorStr = recv.Substring(0, recv.Length - 2);//需要进行xor校验的字符串 string needXorStr = recv.Substring(0, recv.Length - 2);//需要进行xor校验的字符串
@ -374,14 +376,15 @@ namespace PanasonicPLCriver
string checkStr = Utility.XorCheck(needXorStr); string checkStr = Utility.XorCheck(needXorStr);
if (checkStr != recvCheck) if (checkStr != recvCheck)
{ {
OnClose?.Invoke(this, new ShutdownRequestEventArgs("校验失败")); if (OnClose != null)
OnClose(this, new ShutdownRequestEventArgs("校验失败"));
return null; return null;
} }
else else
{ {
if (recv.Substring(4, 1) == "W")//如果是写入命令 if (recv.Substring(4, 1) == "W")//如果是写入命令
{ {
return new byte[0]; return new byte[0];
} }
string dataStr = Utility.Pinchstring(recv, respBeginStr, checkStr); string dataStr = Utility.Pinchstring(recv, respBeginStr, checkStr);
return Utility.HexToBytes(dataStr); return Utility.HexToBytes(dataStr);
@ -391,7 +394,7 @@ namespace PanasonicPLCriver
{ {
switch (code) switch (code)
{ {
case "20":return "未定义"; case "20": return "未定义";
case "21": return "远程单元无法被正确识别,或者发生了数据错误."; case "21": return "远程单元无法被正确识别,或者发生了数据错误.";
case "22": return "用于远程单元的接收缓冲区已满."; case "22": return "用于远程单元的接收缓冲区已满.";
case "23": return "远程单元编号(01 至16)设置与本地单元重复."; case "23": return "远程单元编号(01 至16)设置与本地单元重复.";
@ -430,7 +433,7 @@ namespace PanasonicPLCriver
} }
public ItemData<float> ReadFloat(DeviceAddress address) public ItemData<float> ReadFloat(DeviceAddress address)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public ItemData<short> ReadInt16(DeviceAddress address) public ItemData<short> ReadInt16(DeviceAddress address)
{ {
@ -475,10 +478,10 @@ namespace PanasonicPLCriver
public int WriteBit(DeviceAddress address, bool bit) public int WriteBit(DeviceAddress address, bool bit)
{ {
string respBeginStr = string.Empty; string respBeginStr = string.Empty;
string cmd = CreateWCSCmd(address.Start,address.Bit,address.Area,bit,out respBeginStr); string cmd = CreateWCSCmd(address.Start, address.Bit, address.Area, bit, out respBeginStr);
WriteSyncData(respBeginStr, cmd); WriteSyncData(respBeginStr, cmd);
return 0; return 0;
} }
public int WriteBits(DeviceAddress address, byte bits) public int WriteBits(DeviceAddress address, byte bits)
@ -499,7 +502,7 @@ namespace PanasonicPLCriver
public int WriteInt16(DeviceAddress address, short value) public int WriteInt16(DeviceAddress address, short value)
{ {
string respBeginStr = string.Empty; string respBeginStr = string.Empty;
string cmd = CreateWDCmd(address.Start, new short[1] {value}, out respBeginStr); string cmd = CreateWDCmd(address.Start, new short[1] { value }, out respBeginStr);
WriteSyncData(respBeginStr, cmd); WriteSyncData(respBeginStr, cmd);
return 0; return 0;
} }
@ -609,12 +612,12 @@ namespace PanasonicPLCriver
/// </summary> /// </summary>
public const string WDCmd = "WD"; public const string WDCmd = "WD";
public const byte Xarea = 0;//外部输入 public const byte Xarea = 0;//外部输入
public const byte Yarea = 1;//外部输出 public const byte Yarea = 1;//外部输出
public const byte Rarea = 2;//内部继电器 public const byte Rarea = 2;//内部继电器
public const byte Tarea = 3;//定时器 public const byte Tarea = 3;//定时器
public const byte Carea = 4;//计数器 不支持 public const byte Carea = 4;//计数器 不支持
public const byte Larea = 5;//链接继电器 不支持 public const byte Larea = 5;//链接继电器 不支持
public const byte DTarea = 6;//数据寄存器 DT public const byte DTarea = 6;//数据寄存器 DT
public const byte LDarea = 7;//链接寄存器 LD 不支持 public const byte LDarea = 7;//链接寄存器 LD 不支持

BIN
SCADA/dll/PanasonicDriver.dll

Binary file not shown.
Loading…
Cancel
Save