using System;
using System.Collections;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using Common;
//using System.Windows.Forms;
namespace BeltScaleSystem
{
public class SA600Meas
{
/******************* 网络 ***********************/
TcpClient tcpClient; // TCP 类
string ipAddr = "192.168.185.111"; // IP 地址
Int32 port = 502; // 端口
bool m_alive = false; // 会话状态
NetworkStream m_stream = null; // 数据流
IPAddress addr = null; // 端点
/******************* 可变参数 ***********************/
byte[] request = new byte[100]; // 请求指令
byte[] requestz = new byte[100]; // 请求指令
byte[] respons = new byte[100]; // 响应结果
byte[] request1 = new byte[100]; // 请求指令//202103LIAO
byte[] respons1 = new byte[100]; // 响应结果//202103LIAO
int msgLen = 0;
int msgLen1 = 0;//202103LIAO
#region <属性>
public float Flow; // 瞬时流量
public float Total; // 总累计量
public float BeltSpeed; // 皮带速度
public float FieldTemp; // 现场温度
public int Progress; // 定次进度
public int ProgressTime; // 定次时间
public float CalibrateValue; // 校零数值
//public int StdValue; // 标定数值//20210201
public float StdValue; // 标定数值 //20210201
public bool CalibrateFlag = false;//校零完成标志
public bool MeasStatus = false;//仪表计量状态 true校秤 false计量
public bool IsConnect = true;//连接状态
private int connectTimes = 0;//连接次数
private const int maxConnectTimes = 10;//最大连接次数
private Log l = Log.GetInstance(); //日志
//public
/// IP地址
public string IP
{
get{
return ipAddr;
}
set
{
ipAddr = value;
connect();
}
}
#endregion
#region <构造函数>
public SA600Meas()
{
initNet();
}
///
/// 构造函数
///
/// IP 地址
public SA600Meas(string addr)
{
ipAddr = addr;
initNet();
//initCommand();
}
#endregion
void SwapByte(byte[] data, int startIndex, int endIndex)
{
byte temp = 0x00;
for (int j = startIndex; j < endIndex; j = j + 4)
{
for(int i = 0; i < 4; i= i+2)
{
temp = data[i + j];
data[i + j] = data[i + j + 1];
data[i + j + 1] = temp;
//Swap(ref data[i + j], ref data[i + j + 1]);
}
}
}
private string Byte2String(byte[] data)
{
string str = "";
for (int i = 0; i < data.Length; i++)
{
str = str + data[i].ToString("X2") + " ";
}
return str;
}
public int ReadRing()
{
int ret = 0;
string strCmd = "00 00 00 00 00 06 01 03 03 E8 00 16";//老的,读其它的正常的
// string strCmd = "00 00 00 00 00 06 01 03 00 02 00 02"; //读标定系数
string[] arrayHex = strCmd.Split(' ');
int i = 0;
int dataLen = 0;
foreach (string hex in arrayHex)
{
int intValue = Convert.ToInt32(hex, 16);
request[i] = Convert.ToByte(intValue);
i++;
}
msgLen = i;
dataLen = request[msgLen - 1];
try {
m_stream.Write(request, 0, msgLen);
msgLen = 9 + request[msgLen - 1] * 2;
ret = m_stream.Read(respons, 0, respons.Length);
IsConnect = true;
connectTimes = 0;
}
catch (Exception ex)
{
if(++connectTimes > maxConnectTimes)IsConnect = false;
string msg_error = ex.Message;
connect();
}
string strHex1 = Byte2String(respons);
SwapByte(respons, 9, ret);
string strHex2 = Byte2String(respons);
//LogHelper.WriteLogs("sa600", strHex2);
int startIndex = 9;
byte[] bts = new byte[4];
Array.Copy(respons,startIndex,bts,0,4);
BitArray bits = new BitArray(bts);
MeasStatus = bits[0];//仪表计量状态
CalibrateFlag = bits[3];//校秤完成状态
string str = bits.Length.ToString() + " ";
for (int j = 0; j < bits.Length; j++)
{
str += bits[j].ToString() + ",";
}
startIndex += 4;
startIndex += 4;
startIndex += 4;
Flow = (float)BitConverter.ToUInt32(respons, startIndex) / 100;
startIndex = startIndex + 4;
Total = (float)BitConverter.ToUInt32(respons, startIndex) / 1000;
startIndex = startIndex + 4;
BeltSpeed = (float)BitConverter.ToUInt32(respons, startIndex) / 100;
startIndex = startIndex + 4;
FieldTemp = (float)BitConverter.ToUInt32(respons, startIndex) / 100 - 100;
startIndex = startIndex + 4;
Progress = (int)BitConverter.ToUInt32(respons, startIndex);
startIndex = startIndex + 4;
ProgressTime = (int)BitConverter.ToUInt32(respons, startIndex);
startIndex = startIndex + 4;
CalibrateValue = (float)BitConverter.ToUInt32(respons, startIndex)/100000;
//startIndex = startIndex + 4; //202103LIAO
//StdValue = (int)BitConverter.ToUInt32(respons, startIndex);//202103LIAO
return ret;
}
//20210301读标定系数
public int ReadRingbt()
{
int ret1 = 0;
//string strCmd = "00 00 00 00 00 06 01 03 03 E8 00 16";//老的,读其它的正常的
string strCmd = "00 00 00 00 00 06 01 03 00 02 00 02"; //读标定系数
string[] arrayHex = strCmd.Split(' ');
int i = 0;
int dataLen = 0;
foreach (string hex in arrayHex)
{
int intValue = Convert.ToInt32(hex, 16);
request1[i] = Convert.ToByte(intValue);
i++;
}
msgLen1 = i;
dataLen = request1[msgLen1 - 1];
try
{
m_stream.Write(request1, 0, msgLen1);
//msgLen = 9 + request[msgLen - 1] * 2;
if (m_stream!=null) {
ret1 = m_stream.Read(respons1, 0, respons1.Length);
IsConnect = true;
connectTimes = 0;
}
}
catch (Exception ex)
{
if (++connectTimes > maxConnectTimes) IsConnect = false;
string msg_error = ex.Message;
connect();
}
string strHex1 = Byte2String(respons1);
strHex1 = strHex1.Substring(27, 5);
//strHex1 ="0x"+strHex1;
strHex1 = strHex1.Replace(" ", "");
int xx = Convert.ToInt32(strHex1,16);
StdValue = (float)xx/10000;
// strHex1 = (double)BitConverter.ToUInt32(strHex1,0);
//startIndex = startIndex + 4;
//StdValue = (double)BitConverter.ToUInt32(respons, startIndex);
return ret1;
}
//20210301读标定系数
void InitCmdBuf()
{
//文件头
request[0] = 0x00;
request[1] = 0x00;
request[2] = 0x00;
request[3] = 0x00;
request[4] = 0x00;
request[5] = 0x0B;
//地址
request[6] = 0x01;
//功能号
request[7] = 0x10;
// 起始地址
request[8] = 0x00;
request[9] = 0x00;
//寄存器数量
request[10] = 0x00;
request[11] = 0x02;
//数据字节数
request[12] = 0x04;
//数据
request[13] = 0x00;
request[14] = 0x00;
request[15] = 0x00;
request[16] = 0x00;
return ;
}
private int WriteRing(byte[] data)
{
int ret = -1;
try
{
InitCmdBuf();
if (data.Length == 1)
{
request[14] = data[0];
}
else
{
request[13] = data[0];
request[14] = data[1];
}
msgLen = 17;
m_stream.Write(request, 0, msgLen);
msgLen = 8 + request[12];
ret = m_stream.Read(respons, 0, respons.Length);
ret = respons[msgLen - ret];
byte[] bts = new byte[4];
Array.Copy(respons, 9, bts, 0, 4);
BitArray bits = new BitArray(bts);
MeasStatus = bits[2];//仪表计量状态
}
catch(Exception ex)
{
connect(); // 重连
string msg_error = ex.Message;
}
return ret;
}
// 累计量清零
public int ClearTotal()
{
return WriteRing(new byte[] { 0x40 });
}
// 开始校零操作 读校零结果调用ReadRing
public int StartCalibrateZero()
{
return WriteRing(new byte[] { 0x04 });
}
// 结束校零操作
public int StopCalibrateZero()
{
int ret = WriteRing(new byte[] { 0x08 });
CalibrateFlag = false;
return ret;
}
// 保存校零结果
public int SaveCalibrateValue()
{
int ret = WriteRing(new byte[] { 0x01, 0x00 });
CalibrateFlag = false;
return ret;
}
// 保存标定值
public int SaveBaseValue(byte[] byteArray)
{
// return WriteRing(byteArray);
return WriteRing2(byteArray);
}
void InitCmdBuf2()
{
//0x00 0x00 0x00 0x00 0x00 0x0B 0x01 0x10 0x00 0x02 0x00 0x02 0x04 0x79 0x18 0x00 0x00
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//文件头
requestz[0] = 0x00;
requestz[1] = 0x00;
requestz[2] = 0x00;
requestz[3] = 0x00;
requestz[4] = 0x00;
requestz[5] = 0x0B;
//地址
requestz[6] = 0x01;
//功能号
requestz[7] = 0x10;
// 起始地址
requestz[8] = 0x00;
requestz[9] = 0x02;
//寄存器数量
requestz[10] = 0x00;
requestz[11] = 0x02;
//数据字节数
requestz[12] = 0x04;
//数据
requestz[13] = 0x79;
requestz[14] = 0x18;
requestz[15] = 0x00;
requestz[16] = 0x00;
return;
}
private int WriteRing2(byte[] data)
{
int ret = -1;
try
{
InitCmdBuf2();
if (data.Length == 1)
{
requestz[14] = data[0];
}
else
{
requestz[13] = data[0];
requestz[14] = data[1];
}
msgLen = 17;
m_stream.Write(requestz, 0, msgLen);
msgLen = 8 + requestz[12];
ret = m_stream.Read(respons, 0, respons.Length);
ret = respons[msgLen - ret];
byte[] bts = new byte[4];
Array.Copy(respons, 9, bts, 0, 4);
BitArray bits = new BitArray(bts);
MeasStatus = bits[2];//仪表计量状态
}
catch (Exception ex)
{
connect(); // 重连
string msg_error = ex.Message;
l.WriteLog(22, "皮带秤写物料参数" + msg_error);
}
return ret;
}
// 重置仪表
public int Reset()
{
return WriteRing(new byte[] { 0x80});
}
///
/// 端口
///
public Int32 Port
{
get
{
return port;
}
set
{
port = value;
}
}
///
/// 初始化网络设置
///
protected void initNet()
{
tcpClient = new TcpClient();
port = 502;
m_alive = false;
addr = IPAddress.Parse(ipAddr);
// thread = new Thread(sendHeart);
}
///
/// 连接
///
/// 连接状态
public void connect()
{
try
{
if (m_stream != null)
m_stream.Close();
if (tcpClient != null)
tcpClient.Close();
tcpClient = new TcpClient();
addr = IPAddress.Parse(ipAddr);
tcpClient.Connect(addr, port);
m_stream = tcpClient.GetStream();
//m_stream.ReadTimeout = 1000;
//m_stream.WriteTimeout = 1000;
m_alive = true;
}
catch (Exception ex)
{
string error = ex.Message;
m_alive = false;
throw new Exception("连接仪表失败!"+ex.Message);
}
}
// 发送指令给打印机
public void sendMessage(byte[] data)
{
if (!alive()) throw new Exception("发送失败,请检查仪表连接!",null);
//connect();
try
{
if (alive())
{
m_stream.Write(data, 0, data.Length);
}
}
catch (Exception ex)
{
string error = ex.Message;
//m_alive = false;
throw new Exception("数据发送失败"+ ex.Message); //showErrorMessage("数据发送失败!" + ex.Message);
}
}
// 判断连接状态
protected bool alive()
{
return m_alive;
}
protected void sendCommand(string strCmd)
{
sendMessage(Encoding.Default.GetBytes(strCmd));
}
}
}