/*******************************************************************************
* Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
* 类的信息:
* 1.程序名称:PLCModuleLogic.cs
* 2.功能描述:发送信息到智能设备。
* 编辑履历:
* 作者 日期 版本 修改内容
* 陈晓野 2018/10/18 1.00 新建
*******************************************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Net.Sockets;
using System.Text;
using Curtain.DataAccess;
using Curtain.Framework.Json;
using Curtain.Net.Sockets.PLC;
using Curtain.Net.Sockets.PLC.Model.Siemens;
using Dongke.IBOSS.PRD.Basics.BaseResources;
using Dongke.IBOSS.PRD.Basics.DataAccess;
using Dongke.IBOSS.PRD.Service.DataModels;
using Dongke.IBOSS.PRD.WCF.DataModels;
using Microsoft.Win32;
using Newtonsoft.Json.Linq;
namespace Dongke.IBOSS.PRD.Service.CMNModuleService
{
///
/// PLC相关处理
///
public class PLCModuleLogic
{
#region 恒洁三水三车间工位对应PLC操作
///
/// 恒洁三水三车间工位对应PLC操作 xuwei modify 2020-06-29
///
///
///
public static ServiceResultEntity DoPLCWorkByUser_HEGII_S3(SUserInfo sUserInfo, string barcode,
int procedureid, int workStationType = 0 )
{
using (IDataAccess conn = DataAccess.Create())
{
try
{
//按当前登录用户在工位表中的当前工号查找工位类型
workStationType = getWorkStationType(conn, sUserInfo.UserCode);
//成检交接3211
if (workStationType == 3211)
{
//读取产品型号
object goodsModel = conn.ExecuteScalar(@"
SELECT
g.SEATCOVERCODE
FROM
TP_PM_GROUTINGDAILYDETAIL p
LEFT JOIN TP_MST_GOODS g ON g.GOODSID = p.GOODSID
WHERE
p.VALUEFLAG = '1'
AND p.BARCODE = @BARCODE@
",
new CDAParameter("BARCODE", barcode)
);
//调用PLC的参数集合
Hashtable plcPara = new Hashtable();
plcPara.Add("barcode", barcode);
plcPara.Add("procedureid", procedureid);
plcPara.Add("goodsmodel", goodsModel);
return plcWrite(conn, sUserInfo.UserCode, workStationType, plcPara);
}
//成检交接3212
if (workStationType == 3212)
{
}
return new ServiceResultEntity() { Status = Constant.ServiceResultStatus.Other, Message = "当前工号无工位信息" };
}
catch (Exception ex)
{
Curtain.Log.Logger.Error(ex);
return new ServiceResultEntity() {
Status = Constant.ServiceResultStatus.Other,
Message = "PLC写入失败!"
};
}
finally
{
conn?.Close();
}
}
}
///
/// 获取工位类型ID xuwei add 2020-06-29
///
///
///
///
private static int getWorkStationType(IDataAccess conn,string userCode)
{
return Convert.ToInt32(conn.ExecuteScalar(@"
SELECT
t.WORKSTATIONTYPEID
FROM
TP_MST_WORKSTATION w
LEFT JOIN TP_SYS_WORKSTATIONTYPE t ON w.WORKSTATIONTYPEID = t.WORKSTATIONTYPEID
WHERE
w.USERCODE = @USERCODE@
",
new CDAParameter("USERCODE", userCode)
));
}
///
/// 写PLC xuwei add 2020-06-29
///
///
///
///
///
///
private static ServiceResultEntity plcWrite(IDataAccess conn,string userCode,int workStationType,Hashtable plcPara)
{
//读取工位配置信息
DataTable dataTable = conn.ExecuteDatatable(@"
SELECT
*
FROM
TP_MST_WORKSTATION t
WHERE
t.WORKSTATIONTYPEID = @WORKSTATIONTYPE@
AND USERCODE =@USERCODE@
",
new CDAParameter("WORKSTATIONTYPE", workStationType),
new CDAParameter("USERCODE", userCode)
);
if (dataTable == null || dataTable.Rows.Count == 0)
{
return new ServiceResultEntity() { Status = Constant.ServiceResultStatus.Other, Message = "当前工号无工位信息" };
}
string ip = dataTable.Rows[0]["PLCIP"] + "";
int port = Convert.ToInt32(dataTable.Rows[0]["PLCPORT"]);
JArray plcObj = JArray.Parse(dataTable.Rows[0]["PLCOBJECT"].ToString());
//写入PLC
using (SocketClient plc = new SocketClient())
{
//手动写
//plc.Connect(ip, port);
//plc.Write("D", "102.2", plcPara["barcode"].ToString());
//plc.Write("D", "102.14", Convert.ToInt16(plcPara["goodsmodel"]));
//自动按配置写
plc.Connect(ip, port);
for (int i = 0; i < plcObj.Count; i++)
{
if (plcObj[i]["type"].ToString().ToLower() == "string")
plc.Write(plcObj[i]["code"].ToString(), plcObj[i]["number"].ToString(), plcPara[plcObj[i]["name"].ToString()].ToString());
else if (plcObj[i]["type"].ToString().ToLower() == "int")
plc.Write(plcObj[i]["code"].ToString(), plcObj[i]["number"].ToString(), Convert.ToInt16(plcPara[plcObj[i]["name"].ToString()]));
}
}
//写入操作成功日志
Curtain.Log.Logger.Debug("PLC写入成功!");
//PLC操作成功
return new ServiceResultEntity() {
Status = Constant.ServiceResultStatus.Success,
Message = "" //一定不可以有值,为空时才是提交成功
};
}
#endregion
}
}