feat: 增加LG/TCS-AGV接口并完善物料校验与Function逻辑

This commit is contained in:
XingCheng3
2026-07-16 16:47:45 +08:00
parent 7303ddde9a
commit 8e44e11248
74 changed files with 4324 additions and 1091 deletions

View File

@@ -158,8 +158,6 @@ namespace MisDataSaveDateMesRead
//保存质量数
BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF);
BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW, isCheck);
//保存质量数据到 接口表
MisDataFun.SaveQualityInterfaceData(opName, engineID);
}
catch (Exception err)
{

View File

@@ -212,13 +212,14 @@ namespace MisDataFunDll
/// <param name="opName"></param>
/// <param name="notice"></param>
/// <returns></returns>
public static DataTable IOT_ReqData_UpLoad_IsSend(string opName, string OrderFrom, string reqType)
public static DataTable IOT_ReqData_UpLoad_IsSend(string opName, string OrderFrom, string reqType, string engineID = "")
{
string produceName = "接口_IOT接口_报工记录_是否报工判断";
SqlParameter[] thisParms = new SqlParameter[3];
SqlParameter[] thisParms = new SqlParameter[4];
thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName);
thisParms[1] = new System.Data.SqlClient.SqlParameter("@订单号", OrderFrom);
thisParms[2] = new System.Data.SqlClient.SqlParameter("@报工类型", reqType);
thisParms[3] = new System.Data.SqlClient.SqlParameter("@工件编号", engineID ?? "");
DataAccess.ExecuteStoredProcedure(produceName, ref thisParms, out DataTable dt);
return dt;
}
@@ -1772,6 +1773,19 @@ namespace MisDataFunDll
return dt;
}
/// <summary>
/// 根据工件编号查询派工订单执行计划信息
/// </summary>
public static DataTable XD_GetPlanInfoByEngineID(string engineID)
{
DataTable dt = new DataTable();
string procedureName = "XD_派工订单执行计划_按工件编号查询";
SqlParameter[] thisParms = new SqlParameter[1];
thisParms[0] = new System.Data.SqlClient.SqlParameter("@工件编号", engineID ?? "");
DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out dt);
return dt;
}
/// <summary>
/// 报警工位记录表_MOBY_查询
/// </summary>

View File

@@ -1,95 +0,0 @@
-- 现场总装数据库MESBasicDB_XD_ZZ
-- 用途:支持 AGV lower/raise 回调与 PLC 允许下降/举升放行查询。
-- 说明:请在目标库手工执行。本脚本不直接修改 AGV_光栅请求记录 表结构。
SET NOCOUNT ON;
GO
-- 1. 增加变量类型代码。500/501 是 MES 写 PLC 请求位550/551 是 PLC 允许位。
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_基本变量变量类型代码] WHERE [] = 500)
BEGIN
INSERT INTO [dbo].[MES_基本变量变量类型代码]
([], [TagTypeDataType], [TagName], [], [TagTypeChange], [MesTagTypeChange], [WebTagTypeChange], [], [])
VALUES
(N'X', 11, N'AGV请求下降', 500, 1, 0, 1, N'AGV请求下降', N'AGV请求下降');
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_基本变量变量类型代码] WHERE [] = 501)
BEGIN
INSERT INTO [dbo].[MES_基本变量变量类型代码]
([], [TagTypeDataType], [TagName], [], [TagTypeChange], [MesTagTypeChange], [WebTagTypeChange], [], [])
VALUES
(N'X', 11, N'AGV请求举升', 501, 1, 0, 1, N'AGV请求举升', N'AGV请求举升');
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_基本变量变量类型代码] WHERE [] = 550)
BEGIN
INSERT INTO [dbo].[MES_基本变量变量类型代码]
([], [TagTypeDataType], [TagName], [], [TagTypeChange], [MesTagTypeChange], [WebTagTypeChange], [], [])
VALUES
(N'X', 11, N'允许AGV下降', 550, 1, 0, 1, N'允许AGV下降', N'允许AGV下降');
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_基本变量变量类型代码] WHERE [] = 551)
BEGIN
INSERT INTO [dbo].[MES_基本变量变量类型代码]
([], [TagTypeDataType], [TagName], [], [TagTypeChange], [MesTagTypeChange], [WebTagTypeChange], [], [])
VALUES
(N'X', 11, N'允许AGV举升', 551, 1, 0, 1, N'允许AGV举升', N'允许AGV举升');
END
GO
-- 2. 扩展 AGV continueTask 放行查询。
-- apply/release 保持原有 XD_库位Moby 查询。
-- lower/raise 从 AGV_光栅请求记录 取最新未允许或最近请求,避免改动 XD_库位Moby 与历史表列顺序。
ALTER PROCEDURE [dbo].[AGV_允许进入离开_查询]
@opName nvarchar(50) = 'AC0901-02',
@engineID nvarchar(50) = '0',
@type nvarchar(50) = 'apply'
AS
BEGIN
SET NOCOUNT ON;
IF (@type = 'apply')
BEGIN
SELECT [req] AS reqCode, [task] AS taskCode
FROM [dbo].[XD_库位Moby]
WHERE [] = @opName
AND [AGV请求进入时间] IS NOT NULL;
END
IF (@type = 'release')
BEGIN
SELECT [req] AS reqCode, [task] AS taskCode
FROM [dbo].[XD_库位Moby]
WHERE [] = @opName
AND [AGV请求离开时间] IS NOT NULL;
END
IF (@type = 'lower')
BEGIN
SELECT TOP 1 [reqCode], [taskCode]
FROM [dbo].[AGV_光栅请求记录]
WHERE [method] = 'lower'
AND (
[currentPositionCode] = @opName
OR [currentPositionCode] LIKE @opName + N'[_]%'
OR [wbCode] = @opName
)
ORDER BY ISNULL([], 0) ASC, [] DESC, [ID] DESC;
END
IF (@type = 'raise')
BEGIN
SELECT TOP 1 [reqCode], [taskCode]
FROM [dbo].[AGV_光栅请求记录]
WHERE [method] = 'raise'
AND (
[currentPositionCode] = @opName
OR [currentPositionCode] LIKE @opName + N'[_]%'
OR [wbCode] = @opName
)
ORDER BY ISNULL([], 0) ASC, [] DESC, [ID] DESC;
END
END
GO

View File

@@ -0,0 +1,115 @@
import http from 'node:http'
const host = '127.0.0.1'
const port = Number(process.env.TCS_MOCK_PORT || 18080)
const tasks = new Map()
const sendJson = (response, payload, statusCode = 200) => {
response.writeHead(statusCode, { 'Content-Type': 'application/json; charset=utf-8' })
response.end(JSON.stringify(payload))
}
const success = result => ({
success: true,
message: '仿真接口调用成功',
code: 200,
result,
timestamp: Date.now()
})
const readBody = request => new Promise((resolve, reject) => {
let body = ''
request.setEncoding('utf8')
request.on('data', chunk => { body += chunk })
request.on('end', () => {
if (!body) {
resolve({})
return
}
try {
resolve(JSON.parse(body))
} catch (error) {
reject(error)
}
})
request.on('error', reject)
})
const server = http.createServer(async (request, response) => {
const url = new URL(request.url, `http://${host}:${port}`)
try {
if (request.method === 'POST' && url.pathname === '/api/createExternalBusinessTask') {
const body = await readBody(request)
tasks.set(body.externalCode, body)
console.log('CREATE', JSON.stringify(body))
sendJson(response, success({ externalCode: body.externalCode }))
return
}
if (request.method === 'GET' && url.pathname === '/api/getExternalBusinessTaskStatus') {
const externalCode = url.searchParams.get('externalCode') || ''
sendJson(response, success([{
externalCode,
status: '1',
ip: '10.146.79.9',
type: tasks.get(externalCode)?.type || 'nav_action_program',
beginTime: '2026-07-13 14:40:00',
endTime: '',
remark: '仿真状态同步'
}]))
return
}
if (request.method === 'GET' && url.pathname === '/api/getMcrInfo') {
sendJson(response, success([{
name: 'AGV-01',
ip: '10.146.79.9',
speed: 0,
power: 80,
autoCharging: '1',
chargingThreshold: 20,
status: '0',
currentPos: 'S000214',
control: '1',
CameraInfo: ''
}]))
return
}
const successfulGetRoutes = new Set([
'/api/cancelExternalBusinessTask',
'/api/stopExternalBusinessTask',
'/api/reset',
'/api/stopNow'
])
if (request.method === 'GET' && successfulGetRoutes.has(url.pathname)) {
console.log('GET', url.pathname, url.search)
sendJson(response, success('成功'))
return
}
sendJson(response, {
success: false,
message: `未实现的仿真路由:${request.method} ${url.pathname}`,
code: 500,
result: null,
timestamp: Date.now()
}, 404)
} catch (error) {
sendJson(response, {
success: false,
message: error.message,
code: 500,
result: null,
timestamp: Date.now()
}, 500)
}
})
server.listen(port, host, () => {
console.log(`TCS AGV mock listening on http://${host}:${port}`)
})
const close = () => server.close(() => process.exit(0))
process.on('SIGINT', close)
process.on('SIGTERM', close)

View File

@@ -0,0 +1,711 @@
SET NOCOUNT ON
GO
IF OBJECT_ID(N'dbo.XD_TCS_AGV_配置', N'U') IS NULL
BEGIN
CREATE TABLE dbo.XD_TCS_AGV_配置
(
nvarchar(50) NOT NULL CONSTRAINT PK_XD_TCS_AGV_配置 PRIMARY KEY,
nvarchar(500) NOT NULL,
nvarchar(200) NULL,
bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_配置_是否启用 DEFAULT(1),
datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_配置_操作时间 DEFAULT(GETDATE())
)
END
GO
IF OBJECT_ID(N'dbo.XD_TCS_AGV_点位配置', N'U') IS NULL
BEGIN
CREATE TABLE dbo.XD_TCS_AGV_点位配置
(
ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_点位配置 PRIMARY KEY,
线 nvarchar(20) NOT NULL,
MES工位号 nvarchar(50) NOT NULL,
nvarchar(50) NOT NULL,
WorkStation nvarchar(50) NOT NULL,
XSDProgramName nvarchar(100) NOT NULL,
XSEProgramName nvarchar(100) NOT NULL,
XSDProgramName nvarchar(100) NOT NULL,
XSEProgramName nvarchar(100) NOT NULL,
int NOT NULL,
bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_点位配置_是否启用 DEFAULT(1),
datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_点位配置_操作时间 DEFAULT(GETDATE()),
CONSTRAINT UK_XD_TCS_AGV_点位配置_MES工位号 UNIQUE(MES工位号),
CONSTRAINT UK_XD_TCS_AGV_点位配置_WorkStation UNIQUE(WorkStation)
)
END
GO
IF OBJECT_ID(N'dbo.XD_TCS_AGV_型号动作映射', N'U') IS NULL
BEGIN
CREATE TABLE dbo.XD_TCS_AGV_型号动作映射
(
ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_型号动作映射 PRIMARY KEY,
线 nvarchar(20) NOT NULL,
nvarchar(100) NOT NULL,
nvarchar(10) NOT NULL,
XSD bit NOT NULL,
XSE bit NOT NULL,
bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_型号动作映射_是否启用 DEFAULT(1),
datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_型号动作映射_操作时间 DEFAULT(GETDATE()),
CONSTRAINT UK_XD_TCS_AGV_型号动作映射 UNIQUE(线,,),
CONSTRAINT CK_XD_TCS_AGV_型号动作映射_动作 CHECK( IN(N'',N'')),
CONSTRAINT CK_XD_TCS_AGV_型号动作映射_组合 CHECK(XSD=1 OR XSE=1)
)
END
GO
IF OBJECT_ID(N'dbo.XD_TCS_AGV_任务', N'U') IS NULL
BEGIN
CREATE TABLE dbo.XD_TCS_AGV_任务
(
ID bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_任务 PRIMARY KEY,
nvarchar(100) NOT NULL,
nvarchar(100) NULL,
MES工位号 nvarchar(50) NOT NULL,
nvarchar(50) NULL,
TCS站点 nvarchar(50) NULL,
nvarchar(20) NOT NULL,
nvarchar(100) NULL,
nvarchar(20) NULL,
ProgramName nvarchar(100) NULL,
nvarchar(50) NOT NULL,
nvarchar(max) NOT NULL,
int NOT NULL,
nvarchar(50) NULL,
IP nvarchar(50) NULL,
nvarchar(20) NOT NULL,
nvarchar(50) NULL,
int NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_任务状态 DEFAULT(0),
nvarchar(50) NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_状态说明 DEFAULT(N'未开始'),
nvarchar(50) NULL,
nvarchar(50) NULL,
TCS备注 nvarchar(1000) NULL,
nvarchar(max) NULL,
nvarchar(max) NULL,
nvarchar(2000) NULL,
PLC bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_是否通知PLC DEFAULT(0),
PLC已通知 bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_PLC已通知 DEFAULT(0),
int NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_处理状态 DEFAULT(0),
bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_已复位 DEFAULT(0),
nvarchar(50) NULL,
datetime NULL,
nvarchar(1000) NULL,
datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_创建时间 DEFAULT(GETDATE()),
datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_更新时间 DEFAULT(GETDATE()),
CONSTRAINT UK_XD_TCS_AGV_任务_外部任务编号 UNIQUE(),
CONSTRAINT CK_XD_TCS_AGV_任务_状态 CHECK( IN (0,1,2,3,4,5))
)
CREATE INDEX IX_XD_TCS_AGV_任务_状态时间
ON dbo.XD_TCS_AGV_任务(, DESC)
CREATE INDEX IX_XD_TCS_AGV_任务_工位时间
ON dbo.XD_TCS_AGV_任务(MES工位号, DESC)
END
GO
IF COL_LENGTH(N'dbo.XD_TCS_AGV_任务', N'产品型号') IS NULL
ALTER TABLE dbo.XD_TCS_AGV_任务 ADD nvarchar(100) NULL
GO
IF COL_LENGTH(N'dbo.XD_TCS_AGV_任务', N'动作组合') IS NULL
ALTER TABLE dbo.XD_TCS_AGV_任务 ADD nvarchar(20) NULL
GO
IF COL_LENGTH(N'dbo.XD_TCS_AGV_任务', N'已复位') IS NULL
BEGIN
ALTER TABLE dbo.XD_TCS_AGV_任务 ADD bit NOT NULL
CONSTRAINT DF_XD_TCS_AGV_任务_已复位 DEFAULT(0)
END
GO
IF EXISTS
(
SELECT 1 FROM sys.check_constraints
WHERE parent_object_id=OBJECT_ID(N'dbo.XD_TCS_AGV_任务')
AND name=N'CK_XD_TCS_AGV_任务_状态'
)
ALTER TABLE dbo.XD_TCS_AGV_任务 DROP CONSTRAINT CK_XD_TCS_AGV_任务_状态
GO
ALTER TABLE dbo.XD_TCS_AGV_任务 ADD CONSTRAINT CK_XD_TCS_AGV_任务_状态
CHECK( IN (0,1,2,3,4,5))
GO
IF OBJECT_ID(N'dbo.XD_TCS_AGV_位置状态', N'U') IS NULL
BEGIN
CREATE TABLE dbo.XD_TCS_AGV_位置状态
(
ID int NOT NULL CONSTRAINT PK_XD_TCS_AGV_位置状态 PRIMARY KEY,
IP nvarchar(50) NULL,
nvarchar(100) NULL,
nvarchar(100) NULL,
nvarchar(max) NULL,
datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_位置状态_更新时间 DEFAULT(GETDATE()),
CONSTRAINT CK_XD_TCS_AGV_位置状态_单车 CHECK(ID = 1)
)
END
GO
IF OBJECT_ID(N'dbo.XD_TCS_AGV_操作记录', N'U') IS NULL
BEGIN
CREATE TABLE dbo.XD_TCS_AGV_操作记录
(
ID bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_操作记录 PRIMARY KEY,
nvarchar(100) NULL,
MES工位号 nvarchar(50) NULL,
nvarchar(50) NOT NULL,
nvarchar(50) NULL,
nvarchar(max) NULL,
nvarchar(max) NULL,
bit NOT NULL,
nvarchar(1000) NULL,
datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_操作记录_操作时间 DEFAULT(GETDATE())
)
CREATE INDEX IX_XD_TCS_AGV_操作记录_时间
ON dbo.XD_TCS_AGV_操作记录( DESC)
END
GO
DECLARE @ TABLE
(
nvarchar(50),
nvarchar(500),
nvarchar(200)
)
INSERT INTO @ VALUES
(N'TCS_BaseUrl', N'http://10.112.111.21:11008', N'TCS调度服务地址客户已确认'),
(N'TCS_Enabled', N'0', N'1启用真实下发0仅允许查询配置'),
(N'McrGroup', N'G001', N'机器人组'),
(N'McrIp', N'10.146.79.9', N'客户确认的单台AGV IP'),
(N'TCS_OperatorUserId', N'BZS001', N'TCS任务状态定向推送标识'),
(N'DefaultPriority', N'1', N'默认任务优先级'),
(N'HttpTimeoutSeconds', N'15', N'TCS HTTP超时秒数')
MERGE dbo.XD_TCS_AGV_配置 AS T
USING @ AS S ON T. = S.
WHEN NOT MATCHED THEN
INSERT(,,) VALUES(S.,S.,S.);
GO
DECLARE @线 nvarchar(20)
SELECT TOP 1 @线 = FROM dbo. WHERE = N'产线名称'
DECLARE @ TABLE
(
线 nvarchar(20), MES工位号 nvarchar(50), nvarchar(50), WorkStation nvarchar(50),
XSD nvarchar(100), XSE nvarchar(100), XSD nvarchar(100), XSE nvarchar(100), int
)
IF @线 = N'GLKG'
BEGIN
INSERT INTO @ VALUES
(N'GLKG',N'AC0909-01',N'GIS1',N'S000214',N'214GIS1插XSD',N'214GIS1插XSE',N'214GIS1拔XSD',N'214GIS1拔XSE',1),
(N'GLKG',N'AC0909-02',N'GIS2',N'S000215',N'215GIS2插XSD',N'215GIS2插XSE',N'215GIS2拔XSD',N'215GIS2拔XSE',2),
(N'GLKG',N'AC0909-03',N'GIS3',N'S000217',N'217GIS3插XSD',N'217GIS3插XSE',N'217GIS3拔XSD',N'217GIS3拔XSE',3),
(N'GLKG',N'AC0909-04',N'GIS4',N'S000218',N'218GIS4插XSD',N'218GIS4插XSE',N'218GIS4拔XSD',N'218GIS4拔XSE',4),
(N'GLKG',N'AC0909-05',N'GIS5',N'S000219',N'219GIS5插XSD',N'219GIS5插XSE',N'219GIS5拔XSD',N'219GIS5拔XSE',5),
(N'GLKG',N'AC0909-06',N'GIS6',N'S000220',N'220GIS6插XSD',N'220GIS6插XSE',N'220GIS6拔XSD',N'220GIS6拔XSE',6),
(N'GLKG',N'AC0909-07',N'GIS7',N'S000221',N'221GIS7插XSD',N'221GIS7插XSE',N'221GIS7拔XSD',N'221GIS7拔XSE',7),
(N'GLKG',N'AC0909-08',N'GIS8',N'S000222',N'222GIS8插XSD',N'222GIS8插XSE',N'222GIS8拔XSD',N'222GIS8拔XSE',8),
(N'GLKG',N'AC0909-09',N'GIS9',N'S000201',N'201GIS9插XSD',N'201GIS9插XSE',N'201GIS9拔XSD',N'201GIS9拔XSE',9),
(N'GLKG',N'AC0909-10',N'GIS10',N'S000202',N'202GIS10插XSD',N'202GIS10插XSE',N'202GIS10拔XSD',N'202GIS10拔XSE',10)
END
ELSE IF @线 = N'DLQ'
BEGIN
INSERT INTO @ VALUES
(N'DLQ',N'AC0605-01',N'GCB1',N'S000225',N'225GCB1插XSD',N'225GCB1插XSE',N'225GCB1拔XSD',N'225GCB1拔XSE',1),
(N'DLQ',N'AC0605-02',N'GCB2',N'S000226',N'226GCB2插XSD',N'226GCB2插XSE',N'226GCB2拔XSD',N'226GCB2拔XSE',2),
(N'DLQ',N'AC0605-03',N'GCB3',N'S000227',N'227GCB3插XSD',N'227GCB3插XSE',N'227GCB3拔XSD',N'227GCB3拔XSE',3),
(N'DLQ',N'AC0605-04',N'GCB4',N'S000228',N'228GCB4插XSD',N'228GCB4插XSE',N'228GCB4拔XSD',N'228GCB4拔XSE',4)
END
MERGE dbo.XD_TCS_AGV_点位配置 AS T
USING @ AS S ON T.MES工位号 = S.MES工位号
WHEN MATCHED THEN UPDATE SET
T.线=S.线,T.=S.,T.WorkStation=S.WorkStation,
T.XSDProgramName=S.XSD,T.XSEProgramName=S.XSE,
T.XSDProgramName=S.XSD,T.XSEProgramName=S.XSE,
T.=S.,T.=1,T.=GETDATE()
WHEN NOT MATCHED THEN INSERT
(线,MES工位号,,WorkStation,XSDProgramName,XSEProgramName,XSDProgramName,XSEProgramName,)
VALUES(S.线,S.MES工位号,S.,S.WorkStation,S.XSD,S.XSE,S.XSD,S.XSE,S.);
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_配置_获取
AS
BEGIN
SET NOCOUNT ON
SELECT
TCS_BaseUrl = MAX(CASE WHEN =N'TCS_BaseUrl' THEN END),
TCS_Enabled = MAX(CASE WHEN =N'TCS_Enabled' THEN END),
McrGroup = MAX(CASE WHEN =N'McrGroup' THEN END),
McrIp = MAX(CASE WHEN =N'McrIp' THEN END),
TCS_OperatorUserId = MAX(CASE WHEN =N'TCS_OperatorUserId' THEN END),
DefaultPriority = MAX(CASE WHEN =N'DefaultPriority' THEN END),
HttpTimeoutSeconds = MAX(CASE WHEN =N'HttpTimeoutSeconds' THEN END)
FROM dbo.XD_TCS_AGV_配置 WHERE =1
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_点位配置_查询
@MES工位号 nvarchar(50) = N''
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM dbo.XD_TCS_AGV_点位配置
WHERE =1 AND (@MES工位号=N'' OR MES工位号=@MES工位号)
ORDER BY
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_型号动作映射_查询
@线 nvarchar(20),
@ nvarchar(100),
@ nvarchar(10)
AS
BEGIN
SET NOCOUNT ON
SELECT TOP 1 ID,线,,,XSD,XSE,
CASE WHEN XSD=1 AND XSE=1 THEN N'XSD+XSE'
WHEN XSD=1 THEN N'XSD' ELSE N'XSE' END
FROM dbo.XD_TCS_AGV_型号动作映射
WHERE 线=@线 AND =@
AND =@ AND =1
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_库位产品_查询
@MES工位号 nvarchar(50)
AS
BEGIN
SET NOCOUNT ON
SELECT TOP 1 ,
FROM dbo.XD_磨合_状态
WHERE =@MES工位号
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_创建
@ nvarchar(100),
@ nvarchar(100)=N'',
@MES工位号 nvarchar(50),
@ nvarchar(20),
@ nvarchar(100)=N'',
@ nvarchar(20)=N'',
@ProgramName nvarchar(100)=N'',
@ nvarchar(50),
@ nvarchar(max),
@ int,
@ nvarchar(50)=N'',
@IP nvarchar(50)=N'',
@ nvarchar(20),
@ nvarchar(50)=N'',
@PLC bit=0
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_点位配置 WHERE MES工位号=@MES工位号 AND =1)
BEGIN
ROLLBACK
SELECT 2 result,N'工位未配置TCS点位' msg
RETURN
END
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
BEGIN
ROLLBACK
SELECT 2 result,N'外部任务编号已存在' msg
RETURN
END
IF ISNULL(@,N'')<>N''
BEGIN
DECLARE @ nvarchar(50),@ int,@ int,@ bit
SELECT @=MES工位号,@=,
@=,@=
FROM dbo.XD_TCS_AGV_任务 WITH(UPDLOCK,HOLDLOCK)
WHERE =@
IF @ IS NULL
BEGIN
ROLLBACK
SELECT 2 result,N'原失败任务不存在' msg
RETURN
END
IF @ NOT IN(4,5) OR ISNULL(@,0)<>0
BEGIN
ROLLBACK
SELECT 2 result,N'原任务不是待处理的失败任务' msg
RETURN
END
IF ISNULL(@,0)<>1
BEGIN
ROLLBACK
SELECT 2 result,N'请先复位原失败任务对应的移动机器人' msg
RETURN
END
IF @<>@MES工位号
BEGIN
ROLLBACK
SELECT 2 result,N'恢复任务工位必须与原失败任务一致' msg
RETURN
END
END
-- MES允许各工位独立下发任务排队与执行顺序由TCS调度。
DECLARE @ nvarchar(50),@TCS站点 nvarchar(50)
SELECT @=,@TCS站点=WorkStation
FROM dbo.XD_TCS_AGV_点位配置 WHERE MES工位号=@MES工位号 AND =1
INSERT INTO dbo.XD_TCS_AGV_任务
(,,MES工位号,,TCS站点,,,,ProgramName,,,
,,IP,,,PLC)
VALUES
(@,NULLIF(@,N''),@MES工位号,@,@TCS站点,@,NULLIF(@,N''),NULLIF(@,N''),NULLIF(@ProgramName,N''),
@,@,@,@,@IP,@,@,@PLC)
DECLARE @ID bigint=SCOPE_IDENTITY()
COMMIT
SELECT 1 result,N'任务已创建' msg,@ID ID,@
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_下发结果更新
@ nvarchar(100),
@ nvarchar(max)=N'',
@ nvarchar(max)=N'',
@ bit,
@ nvarchar(2000)=N''
AS
BEGIN
SET NOCOUNT ON
UPDATE dbo.XD_TCS_AGV_任务 SET
=@,=@,
=CASE WHEN @=1 THEN 0 ELSE 4 END,
=CASE WHEN @=1 THEN N'未开始' ELSE N'任务错误' END,
=NULLIF(@,N''),=GETDATE()
WHERE =@
SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_状态更新
@ nvarchar(100),
@ int,
@IP nvarchar(50)=N'',
@ nvarchar(50)=N'',
@ nvarchar(50)=N'',
@ nvarchar(50)=N'',
@ nvarchar(1000)=N''
AS
BEGIN
SET NOCOUNT ON
IF @ NOT IN(0,1,2,3,4,5)
BEGIN
SELECT 2 result,N'任务状态不正确' msg
RETURN
END
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
BEGIN
SELECT 2 result,N'外部任务编号不存在' msg
RETURN
END
DECLARE @ int
SELECT @= FROM dbo.XD_TCS_AGV_任务 WHERE =@
IF (@ IN(2,3,5) AND @<>@)
OR (@=4 AND @ NOT IN(4,5))
BEGIN
SELECT 1 result,N'已忽略结束状态变更' msg,MES工位号,,PLC,PLC已通知
FROM dbo.XD_TCS_AGV_任务 WHERE =@
RETURN
END
UPDATE dbo.XD_TCS_AGV_任务 SET
=@,
=CASE @ WHEN 0 THEN N'未开始' WHEN 1 THEN N'进行中' WHEN 2 THEN N'已完成' WHEN 3 THEN N'已取消' WHEN 4 THEN N'任务错误' ELSE N'任务错误(已处理)' END,
IP=CASE WHEN @IP=N'' THEN IP ELSE @IP END,
=CASE WHEN @=N'' THEN ELSE @ END,
=CASE WHEN @=N'' THEN ELSE @ END,
=CASE WHEN @=N'' THEN ELSE @ END,
TCS备注=NULLIF(@,N''),
=CASE WHEN @=4 THEN NULLIF(@,N'') ELSE END,
=CASE WHEN @=5 THEN 1 ELSE END,
=GETDATE()
WHERE =@
SELECT 1 result,N'状态已更新' msg,MES工位号,,PLC,PLC已通知
FROM dbo.XD_TCS_AGV_任务 WHERE =@
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_PLC通知完成
@ nvarchar(100)
AS
BEGIN
SET NOCOUNT ON
UPDATE dbo.XD_TCS_AGV_任务 SET PLC已通知=1,=GETDATE()
WHERE =@ AND =2
SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_获取
@ nvarchar(100)
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM dbo.XD_TCS_AGV_任务 WHERE =@
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_人工处理
@ nvarchar(100),
@ nvarchar(50)=N'',
@ nvarchar(1000)=N''
AS
BEGIN
SET NOCOUNT ON
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@ AND IN(4,5))
BEGIN
SELECT 2 result,N'仅任务错误状态可以标记人工处理' msg
RETURN
END
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@ AND =1)
BEGIN
SELECT 2 result,N'请先复位移动机器人再完成人工处理' msg
RETURN
END
UPDATE dbo.XD_TCS_AGV_任务 SET =1,=@,=GETDATE(),=@,=GETDATE()
WHERE =@
SELECT 1 result,N'已标记人工处理' msg
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_复位标记
@ nvarchar(100)
AS
BEGIN
SET NOCOUNT ON
UPDATE dbo.XD_TCS_AGV_任务 SET =1,=GETDATE()
WHERE =@ AND IN(4,5)
SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result,
CASE WHEN @@ROWCOUNT=1 THEN N'复位状态已记录' ELSE N'未找到对应失败任务' END msg
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_本地状态设置
@ nvarchar(100),
@ int,
@ nvarchar(50),
@ nvarchar(2000)=N''
AS
BEGIN
SET NOCOUNT ON
UPDATE dbo.XD_TCS_AGV_任务 SET =@,=@,
=NULLIF(@,N''),=GETDATE()
WHERE =@
SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_分页查询
@ nvarchar(50)=N'',
@ nvarchar(50)=N'',
@MES工位号 nvarchar(50)=N'',
@ nvarchar(100)=N'',
@ nvarchar(20)=N'',
@ nvarchar(10)=N'',
@ nvarchar(20)=N'',
@PageCurrent int=1,
@PageSize int=20,
@PageCount int output,
@ItemCount int output
AS
BEGIN
SET NOCOUNT ON
DECLARE @where nvarchar(2000)=N'1=1'
IF @<>N'' SET @where+=N' AND 创建时间>='''+REPLACE(@,'''','''''')+N''''
IF @<>N'' SET @where+=N' AND 创建时间<='''+REPLACE(@,'''','''''')+N''''
IF @MES工位号<>N'' SET @where+=N' AND MES工位号='''+REPLACE(@MES工位号,'''','''''')+N''''
IF @<>N'' SET @where+=N' AND 外部任务编号 LIKE ''%'+REPLACE(@,'''','''''')+N'%'''
IF @<>N'' SET @where+=N' AND 任务动作='''+REPLACE(@,'''','''''')+N''''
IF @<>N'' SET @where+=N' AND 任务状态='+CONVERT(nvarchar(10),CONVERT(int,@))
IF @<>N'' SET @where+=N' AND 来源='''+REPLACE(@,'''','''''')+N''''
EXEC sp_xt_pagesplit N'XD_TCS_AGV_任务',N'ID',@where,
N'ID,外部任务编号,原任务编号,MES工位号,现场位置,TCS站点,任务动作,产品型号,动作组合,ProgramName,任务类型,优先级,机器人组,机器人IP,来源,操作人,任务状态,状态说明,开始时间,结束时间,TCS备注,错误信息,是否通知PLC,PLC已通知,处理状态,已复位,处理人,处理时间,处理说明,创建时间,更新时间',
N'ID DESC',@PageCurrent,@PageSize,@PageCount output,@ItemCount output
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_详情查询
@ nvarchar(100)
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM dbo.XD_TCS_AGV_任务 WHERE =@
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_当前查询
AS
BEGIN
SET NOCOUNT ON
SELECT TOP 1 * FROM dbo.XD_TCS_AGV_任务
WHERE =1
ORDER BY DESC,ID DESC
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_概览查询
AS
BEGIN
SET NOCOUNT ON
SELECT
ISNULL(SUM(CASE WHEN =0 THEN 1 ELSE 0 END),0) ,
ISNULL(SUM(CASE WHEN =1 THEN 1 ELSE 0 END),0) ,
ISNULL(SUM(CASE WHEN IN(4,5) AND =0 THEN 1 ELSE 0 END),0)
FROM dbo.XD_TCS_AGV_任务
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_工位日志_分页查询
@MES工位号 nvarchar(50)=N'',
@ nvarchar(50)=N'',
@ nvarchar(200)=N'',
@ nvarchar(50)=N'',
@ nvarchar(50)=N'',
@PageCurrent int=1,
@PageSize int=20,
@PageCount int OUTPUT,
@ItemCount int OUTPUT
AS
BEGIN
SET NOCOUNT ON
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=20
DECLARE @ datetime=TRY_CONVERT(datetime,NULLIF(@,N''))
DECLARE @ datetime=TRY_CONVERT(datetime,NULLIF(@,N''))
SELECT @ItemCount=COUNT(1)
FROM dbo.MES_系统日志 L
WHERE EXISTS
(
SELECT 1 FROM dbo.XD_TCS_AGV_点位配置 P
WHERE P.MES工位号=L. AND P.=1
)
AND (@MES工位号=N'' OR L.=@MES工位号)
AND (@=N'' OR L.=@)
AND (@=N'' OR L. LIKE N'%'+@+N'%')
AND (@ IS NULL OR L.>=@)
AND (@ IS NULL OR L.<=@)
SET @PageCount=CASE WHEN @ItemCount=0 THEN 0 ELSE CEILING(@ItemCount*1.0/@PageSize) END
SELECT L.ID,L.,L.,L.,L.
FROM dbo.MES_系统日志 L
WHERE EXISTS
(
SELECT 1 FROM dbo.XD_TCS_AGV_点位配置 P
WHERE P.MES工位号=L. AND P.=1
)
AND (@MES工位号=N'' OR L.=@MES工位号)
AND (@=N'' OR L.=@)
AND (@=N'' OR L. LIKE N'%'+@+N'%')
AND (@ IS NULL OR L.>=@)
AND (@ IS NULL OR L.<=@)
ORDER BY L. DESC,L.ID DESC
OFFSET (@PageCurrent-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_位置_更新
@IP nvarchar(50)=N'',
@ nvarchar(100)=N'',
@ nvarchar(100)=N'',
@ nvarchar(max)=N''
AS
BEGIN
SET NOCOUNT ON
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_位置状态 WHERE ID=1)
UPDATE dbo.XD_TCS_AGV_位置状态 SET IP=@IP,=@,=@,=@,=GETDATE() WHERE ID=1
ELSE
INSERT INTO dbo.XD_TCS_AGV_位置状态(ID,IP,,,) VALUES(1,@IP,@,@,@)
SELECT 1 result
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_位置_查询
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM dbo.XD_TCS_AGV_位置状态 WHERE ID=1
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_操作记录_增加
@ nvarchar(100)=N'',
@MES工位号 nvarchar(50)=N'',
@ nvarchar(50),
@ nvarchar(50)=N'',
@ nvarchar(max)=N'',
@ nvarchar(max)=N'',
@ bit,
@ nvarchar(1000)=N''
AS
BEGIN
SET NOCOUNT ON
INSERT INTO dbo.XD_TCS_AGV_操作记录(,MES工位号,,,,,,)
VALUES(NULLIF(@,N''),NULLIF(@MES工位号,N''),@,@,@,@,@,@)
SELECT 1 result
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_操作记录_分页查询
@ nvarchar(50)=N'',
@ nvarchar(50)=N'',
@ nvarchar(50)=N'',
@PageCurrent int=1,
@PageSize int=20,
@PageCount int output,
@ItemCount int output
AS
BEGIN
SET NOCOUNT ON
DECLARE @where nvarchar(1000)=N'1=1'
IF @<>N'' SET @where+=N' AND 操作时间>='''+REPLACE(@,'''','''''')+N''''
IF @<>N'' SET @where+=N' AND 操作时间<='''+REPLACE(@,'''','''''')+N''''
IF @<>N'' SET @where+=N' AND 操作类型='''+REPLACE(@,'''','''''')+N''''
EXEC sp_xt_pagesplit N'XD_TCS_AGV_操作记录',N'ID',@where,
N'ID,外部任务编号,MES工位号,操作类型,操作人,是否成功,操作结果,操作时间',
N'ID DESC',@PageCurrent,@PageSize,@PageCount output,@ItemCount output
END
GO
CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_操作记录_任务查询
@ nvarchar(100)
AS
BEGIN
SET NOCOUNT ON
SELECT ID,,MES工位号,,,,,
FROM dbo.XD_TCS_AGV_操作记录
WHERE =@
ORDER BY ID DESC
END
GO

View File

@@ -0,0 +1,98 @@
SET NOCOUNT ON
DECLARE @ nvarchar(50)=N'UT_AGV_STATE_'
DECLARE @ nvarchar(100)=@+N'BASE'
DECLARE @ nvarchar(100)=@+N'SECOND'
DECLARE @ nvarchar(100)=@+N'NORESET'
DECLARE @ nvarchar(100)=@+N'WRONG_STATION'
DECLARE @ nvarchar(100)=@+N'RECOVERY'
DECLARE @ nvarchar(100)=@+N'BLOCKED'
DECLARE @ nvarchar(100)=@+N'AFTER_HANDLE'
DECLARE @ int=0
DELETE FROM dbo.XD_TCS_AGV_操作记录 WHERE LIKE @+N'%'
DELETE FROM dbo.XD_TCS_AGV_任务 WHERE LIKE @+N'%'
PRINT N'[1] 创建首个任务'
EXEC dbo.XD_TCS_AGV_任务_创建
@,N'',N'AC0909-01',N'',N'',N'nav_action_program',
N'[{"workStation":"S000214"},{"programName":"214GIS1插XSD"},{"programName":"214GIS1插XSE"}]',
1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
SET @+=1
PRINT N'[2] 单车活动任务拦截'
EXEC dbo.XD_TCS_AGV_任务_创建
@,N'',N'AC0909-02',N'',N'',N'nav_action_program',N'[{"workStation":"S000215"}]',
1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
SET @+=1
EXEC dbo.XD_TCS_AGV_任务_本地状态设置 @,4,N'任务错误',N'单元测试失败'
PRINT N'[3] 未复位恢复任务拦截'
EXEC dbo.XD_TCS_AGV_任务_创建
@,@,N'AC0909-01',N'插-单步',N'214GIS1插XSD',N'program',
N'[{"programName":"214GIS1插XSD"}]',1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
SET @+=1
PRINT N'[4] 复位标记与跨工位恢复拦截'
EXEC dbo.XD_TCS_AGV_任务_复位标记 @
EXEC dbo.XD_TCS_AGV_任务_状态更新
@,5,N'10.146.79.9',N'nav_action_program',N'',N'',N'任务错误已处理'
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@ AND =5 AND =1)
SET @+=1
EXEC dbo.XD_TCS_AGV_任务_创建
@,@,N'AC0909-02',N'插-单步',N'215GIS2插XSD',N'program',
N'[{"programName":"215GIS2插XSD"}]',1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
SET @+=1
PRINT N'[5] 复位后同工位恢复放行'
EXEC dbo.XD_TCS_AGV_任务_创建
@,@,N'AC0909-01',N'插-单步',N'214GIS1插XSD',N'program',
N'[{"programName":"214GIS1插XSD"}]',1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
SET @+=1
EXEC dbo.XD_TCS_AGV_任务_状态更新
@,2,N'10.146.79.9',N'program',N'2026-07-13 10:00:00',N'2026-07-13 10:01:00',N''
PRINT N'[6] 原失败任务未处理时继续阻断'
EXEC dbo.XD_TCS_AGV_任务_创建
@,N'',N'AC0909-02',N'',N'',N'nav_action_program',N'[{"workStation":"S000215"}]',
1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
SET @+=1
PRINT N'[7] 人工处理后新任务放行'
EXEC dbo.XD_TCS_AGV_任务_人工处理 @,N'状态机测试',N'恢复任务已完成'
EXEC dbo.XD_TCS_AGV_任务_状态更新 @,2,N'',N'',N'',N'',N'迟到完成'
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@ AND <>5)
SET @+=1
EXEC dbo.XD_TCS_AGV_任务_创建
@,N'',N'AC0909-02',N'',N'',N'nav_action_program',N'[{"workStation":"S000215"}]',
1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@)
SET @+=1
PRINT N'[8] 未复位失败任务不能人工处理,终态不能改写'
EXEC dbo.XD_TCS_AGV_任务_本地状态设置 @,4,N'任务错误',N'终态测试'
EXEC dbo.XD_TCS_AGV_任务_人工处理 @,N'状态机测试',N'不应成功'
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@ AND =1)
SET @+=1
EXEC dbo.XD_TCS_AGV_任务_状态更新 @,2,N'',N'',N'',N'',N'迟到完成'
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE =@ AND <>4)
SET @+=1
SELECT @ AS ,
(SELECT COUNT(*) FROM dbo.XD_TCS_AGV_任务 WHERE LIKE @+N'%') AS
DELETE FROM dbo.XD_TCS_AGV_操作记录 WHERE LIKE @+N'%'
DELETE FROM dbo.XD_TCS_AGV_任务 WHERE LIKE @+N'%'
IF @<>0
RAISERROR(N'AGV数据库状态机测试失败',16,1)
SELECT COUNT(*) AS
FROM dbo.XD_TCS_AGV_任务 WHERE LIKE @+N'%'

View File

@@ -1,173 +0,0 @@
IF OBJECT_ID(N'dbo.XD_电能表谐波数据', N'U') IS NULL
BEGIN
CREATE TABLE dbo.XD_电能表谐波数据
(
ID int IDENTITY(1,1) NOT NULL,
nvarchar(50) NULL,
A相电压总谐波畸变 float NULL,
B相电压总谐波畸变 float NULL,
C相电压总谐波畸变 float NULL,
float NULL,
A相电流总谐波畸变 float NULL,
B相电流总谐波畸变 float NULL,
C相电流总谐波畸变 float NULL,
float NULL,
A相电压奇次谐波畸变 float NULL,
B相电压奇次谐波畸变 float NULL,
C相电压奇次谐波畸变 float NULL,
A相电流奇次谐波畸变 float NULL,
B相电流奇次谐波畸变 float NULL,
C相电流奇次谐波畸变 float NULL,
A相电压偶次谐波畸变 float NULL,
B相电压偶次谐波畸变 float NULL,
C相电压偶次谐波畸变 float NULL,
A相电流偶次谐波畸变 float NULL,
B相电流偶次谐波畸变 float NULL,
C相电流偶次谐波畸变 float NULL,
datetime NULL CONSTRAINT DF_XD_电能表谐波数据_操作时间 DEFAULT (GETDATE()),
CONSTRAINT PK_XD_电能表谐波数据 PRIMARY KEY CLUSTERED (ID ASC)
);
END
GO
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE name = N'IX_XD_电能表谐波数据_工位号_操作时间'
AND object_id = OBJECT_ID(N'dbo.XD_电能表谐波数据')
)
BEGIN
CREATE NONCLUSTERED INDEX IX_XD_电能表谐波数据_工位号_操作时间
ON dbo.XD_电能表谐波数据 ( ASC, DESC);
END
GO
IF OBJECT_ID(N'dbo.XD_电能表谐波数据_增加', N'P') IS NOT NULL
DROP PROCEDURE dbo.XD_电能表谐波数据_增加;
GO
CREATE PROCEDURE dbo.XD_电能表谐波数据_增加
@ nvarchar(50) = N'',
@A相电压总谐波畸变 float = NULL,
@B相电压总谐波畸变 float = NULL,
@C相电压总谐波畸变 float = NULL,
@ float = NULL,
@A相电流总谐波畸变 float = NULL,
@B相电流总谐波畸变 float = NULL,
@C相电流总谐波畸变 float = NULL,
@ float = NULL,
@A相电压奇次谐波畸变 float = NULL,
@B相电压奇次谐波畸变 float = NULL,
@C相电压奇次谐波畸变 float = NULL,
@A相电流奇次谐波畸变 float = NULL,
@B相电流奇次谐波畸变 float = NULL,
@C相电流奇次谐波畸变 float = NULL,
@A相电压偶次谐波畸变 float = NULL,
@B相电压偶次谐波畸变 float = NULL,
@C相电压偶次谐波畸变 float = NULL,
@A相电流偶次谐波畸变 float = NULL,
@B相电流偶次谐波畸变 float = NULL,
@C相电流偶次谐波畸变 float = NULL
AS
BEGIN
SET NOCOUNT ON;
IF NULLIF(LTRIM(RTRIM(@)), N'') IS NULL
RETURN;
-- 电表返回 -1 表示无效数据;任一谐波点无效时,本次整条采集不入库。
IF @A相电压总谐波畸变 = -1
OR @B相电压总谐波畸变 = -1
OR @C相电压总谐波畸变 = -1
OR @ = -1
OR @A相电流总谐波畸变 = -1
OR @B相电流总谐波畸变 = -1
OR @C相电流总谐波畸变 = -1
OR @ = -1
OR @A相电压奇次谐波畸变 = -1
OR @B相电压奇次谐波畸变 = -1
OR @C相电压奇次谐波畸变 = -1
OR @A相电流奇次谐波畸变 = -1
OR @B相电流奇次谐波畸变 = -1
OR @C相电流奇次谐波畸变 = -1
OR @A相电压偶次谐波畸变 = -1
OR @B相电压偶次谐波畸变 = -1
OR @C相电压偶次谐波畸变 = -1
OR @A相电流偶次谐波畸变 = -1
OR @B相电流偶次谐波畸变 = -1
OR @C相电流偶次谐波畸变 = -1
RETURN;
-- 谐波畸变允许为 0只有全部点位都为空时跳过保存。
IF @A相电压总谐波畸变 IS NULL
AND @B相电压总谐波畸变 IS NULL
AND @C相电压总谐波畸变 IS NULL
AND @ IS NULL
AND @A相电流总谐波畸变 IS NULL
AND @B相电流总谐波畸变 IS NULL
AND @C相电流总谐波畸变 IS NULL
AND @ IS NULL
AND @A相电压奇次谐波畸变 IS NULL
AND @B相电压奇次谐波畸变 IS NULL
AND @C相电压奇次谐波畸变 IS NULL
AND @A相电流奇次谐波畸变 IS NULL
AND @B相电流奇次谐波畸变 IS NULL
AND @C相电流奇次谐波畸变 IS NULL
AND @A相电压偶次谐波畸变 IS NULL
AND @B相电压偶次谐波畸变 IS NULL
AND @C相电压偶次谐波畸变 IS NULL
AND @A相电流偶次谐波畸变 IS NULL
AND @B相电流偶次谐波畸变 IS NULL
AND @C相电流偶次谐波畸变 IS NULL
RETURN;
INSERT INTO dbo.XD_电能表谐波数据
(
,
A相电压总谐波畸变,
B相电压总谐波畸变,
C相电压总谐波畸变,
,
A相电流总谐波畸变,
B相电流总谐波畸变,
C相电流总谐波畸变,
,
A相电压奇次谐波畸变,
B相电压奇次谐波畸变,
C相电压奇次谐波畸变,
A相电流奇次谐波畸变,
B相电流奇次谐波畸变,
C相电流奇次谐波畸变,
A相电压偶次谐波畸变,
B相电压偶次谐波畸变,
C相电压偶次谐波畸变,
A相电流偶次谐波畸变,
B相电流偶次谐波畸变,
C相电流偶次谐波畸变
)
VALUES
(
@,
@A相电压总谐波畸变 / 1000.0,
@B相电压总谐波畸变 / 1000.0,
@C相电压总谐波畸变 / 1000.0,
@ / 1000.0,
@A相电流总谐波畸变 / 1000.0,
@B相电流总谐波畸变 / 1000.0,
@C相电流总谐波畸变 / 1000.0,
@ / 1000.0,
@A相电压奇次谐波畸变 / 1000.0,
@B相电压奇次谐波畸变 / 1000.0,
@C相电压奇次谐波畸变 / 1000.0,
@A相电流奇次谐波畸变 / 1000.0,
@B相电流奇次谐波畸变 / 1000.0,
@C相电流奇次谐波畸变 / 1000.0,
@A相电压偶次谐波畸变 / 1000.0,
@B相电压偶次谐波畸变 / 1000.0,
@C相电压偶次谐波畸变 / 1000.0,
@A相电流偶次谐波畸变 / 1000.0,
@B相电流偶次谐波畸变 / 1000.0,
@C相电流偶次谐波畸变 / 1000.0
);
END
GO

View File

@@ -212,8 +212,14 @@
<Compile Include="WebAPI\Other\DewPointData.cs" />
<Compile Include="WebAPI\WEB\WEB_BusinessLogic.cs" />
<Compile Include="WebAPI\WEB\WEB_Models.cs" />
<Compile Include="WebAPI\WEB\LGWEB_BusinessLogic.cs" />
<Compile Include="WebAPI\WEB\LGWEB_Models.cs" />
<Compile Include="WebAPI\AGV\AGV_BusinessLogic.cs" />
<Compile Include="WebAPI\AGV\AGV_Models.cs" />
<Compile Include="WebAPI\AGV\LGAGV_BusinessLogic.cs" />
<Compile Include="WebAPI\AGV\LGAGV_Models.cs" />
<Compile Include="WebAPI\AGV\TCSAGV_BusinessLogic.cs" />
<Compile Include="WebAPI\AGV\TCSAGV_Models.cs" />
<Compile Include="WebAPI\Controller\WEBController.cs" />
<Compile Include="WebAPI\FactoryMES\Analysis508Msg.cs" />
<Compile Include="WebAPI\FactoryMES\CALL_Inerface_DataHandle.cs" />

View File

@@ -0,0 +1,405 @@
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using MisDataSaveDate.Helper;
using static MisDataSaveDate.Helper.ApiLogHelper;
using WebApi;
using MesServerWork;
namespace MisDataSaveDate
{
/// <summary>
/// 临工AGV接口业务处理。
/// </summary>
public class LGAGV_BusinessLogic
{
private const string DirectionMesToAgv = "MES_TO_AGV";
private const string DirectionAgvToMes = "AGV_TO_MES";
/// <summary>
/// MES调用临工AGV两点任务接口。
/// </summary>
public static LGAGV_CallResult CallAddTask(LGAGV_AddTaskRequest request)
{
if (request == null)
{
throw new Exception("AGV任务参数不能为空");
}
if (string.IsNullOrWhiteSpace(request.requestTaskId))
{
throw new Exception("任务ID(requestTaskId)不能为空");
}
if (string.IsNullOrWhiteSpace(request.startPosition))
{
throw new Exception("起点位置(startPosition)不能为空");
}
if (string.IsNullOrWhiteSpace(request.endPosition))
{
throw new Exception("终点位置(endPosition)不能为空");
}
return PostToAgv("AddTaskFromMes", "/api/mes/AddTaskFromMes", request,
request.requestTaskId, null, request.endPosition, null, request.materialCode, null);
}
/// <summary>
/// MES调用临工AGV三点任务接口。
/// </summary>
public static LGAGV_CallResult CallAddTask2(LGAGV_AddTask2Request request)
{
if (request == null)
{
throw new Exception("AGV任务参数不能为空");
}
if (string.IsNullOrWhiteSpace(request.requestTaskId))
{
throw new Exception("任务ID(requestTaskId)不能为空");
}
if (string.IsNullOrWhiteSpace(request.startPosition))
{
throw new Exception("起点位置(startPosition)不能为空");
}
if (string.IsNullOrWhiteSpace(request.midPosition))
{
throw new Exception("中间位置(midPosition)不能为空");
}
if (string.IsNullOrWhiteSpace(request.endPosition))
{
throw new Exception("终点位置(endPosition)不能为空");
}
return PostToAgv("AddTaskFromMes2", "/api/mes/AddTaskFromMes2", request,
request.requestTaskId, null, request.endPosition, null, request.materialCode, null);
}
/// <summary>
/// MES调用临工AGV放行接口。
/// </summary>
public static LGAGV_CallResult CallAllowLeave(LGAGV_AllowLeaveRequest request)
{
if (request == null)
{
throw new Exception("放行参数不能为空");
}
if (string.IsNullOrWhiteSpace(request.requestId))
{
throw new Exception("请求ID(requestId)不能为空");
}
if (string.IsNullOrWhiteSpace(request.position))
{
throw new Exception("位置(position)不能为空");
}
request.allowLeave = 1;
return PostToAgv("AllowLeave", "/api/mes/AllowLeave", request,
null, request.requestId, request.position, null, null, request.agvNo);
}
/// <summary>
/// 处理临工AGV到达/离开回调。
/// </summary>
public static string ProcessStatusUpdate(string url, [FromBody] JObject jobj)
{
var result = LGAGV_Response.Success();
string requestText = jobj?.ToString() ?? "";
SaveLog_Interface_Request(url, 2, requestText, out int aid);
LGAGV_StatusUpdateRequest request = null;
try
{
if (jobj == null)
{
throw new Exception("请求参数不能为空");
}
request = JsonConvert.DeserializeObject<LGAGV_StatusUpdateRequest>(requestText);
if (request == null)
{
throw new Exception("请求参数格式不正确");
}
if (string.IsNullOrWhiteSpace(request.requestId))
{
throw new Exception("请求ID(requestId)不能为空");
}
if (string.IsNullOrWhiteSpace(request.position))
{
throw new Exception("位置(position)不能为空");
}
if (request.type != 1 && request.type != 2)
{
throw new Exception("类型(type)只支持1到达、2离开");
}
string procedureName = request.type == 1 ? "LG_AGV_库位Moby_AGV到达" : "LG_AGV_库位Moby_AGV离开";
var param = new SqlParameter[]
{
new SqlParameter("@requestId", request.requestId ?? ""),
new SqlParameter("@position", request.position ?? ""),
new SqlParameter("@materialCode", request.materialCode ?? ""),
new SqlParameter("@agvNo", request.agvNo ?? "")
};
ExecuteResultProcedure(procedureName, ref param);
WriteOp10PlcStatus(request);
SaveInterfaceRecord("StatusUpdate", DirectionAgvToMes, request.position, request.position,
null, request.requestId, request.position, request.type, request.materialCode, request.agvNo,
"", requestText, "", 1, "");
string typeDesc = request.type == 1 ? "到达" : "离开";
SaveMesLog("LGAGV_StatusUpdate", $"临工AGV{typeDesc}:位置={request.position}, requestId={request.requestId}, AGV={request.agvNo}", MesLogType.INFO);
}
catch (Exception ex)
{
result = LGAGV_Response.Fail(ex.Message);
SaveInterfaceRecord("StatusUpdate", DirectionAgvToMes, request?.position, request?.position,
null, request?.requestId, request?.position, request?.type, request?.materialCode, request?.agvNo,
"", requestText, "", 2, ex.Message);
SaveMesLog("LGAGV_StatusUpdate", ex.Message, MesLogType.ERROR);
}
string responseText = JsonConvert.SerializeObject(result);
SaveLog_Interface_Response(responseText, aid);
return responseText;
}
private static void WriteOp10PlcStatus(LGAGV_StatusUpdateRequest request)
{
if (request == null || string.IsNullOrWhiteSpace(request.position))
{
return;
}
string position = request.position.Trim();
int tagTypeCodeID = 0;
if (request.type == 1 && position.StartsWith("OP10-1-", StringComparison.OrdinalIgnoreCase))
{
tagTypeCodeID = 28;
}
else if (request.type == 1 && position.StartsWith("OP10-2-", StringComparison.OrdinalIgnoreCase))
{
tagTypeCodeID = 29;
}
else if (request.type == 2 && position.StartsWith("OP10-2-", StringComparison.OrdinalIgnoreCase))
{
tagTypeCodeID = 30;
}
if (tagTypeCodeID == 0)
{
return;
}
bool writeResult = MIS_BASE.WritePLC(tagTypeCodeID, "AC1101", true);
string actionDesc = request.type == 1 ? "到达" : "离开";
if (writeResult)
{
SaveMesLog("LGAGV_StatusUpdate", $"OP10 AGV{actionDesc}回写PLC成功点位={position}, TagTypeCodeID={tagTypeCodeID}", MesLogType.INFO);
}
else
{
SaveMesLog("LGAGV_StatusUpdate", $"OP10 AGV{actionDesc}回写PLC失败点位={position}, TagTypeCodeID={tagTypeCodeID}", MesLogType.ERROR);
}
}
/// <summary>
/// 处理临工AGV任务结果回调。
/// </summary>
public static string ProcessTaskResult(string url, [FromBody] JObject jobj)
{
var result = LGAGV_Response.Success();
string requestText = jobj?.ToString() ?? "";
SaveLog_Interface_Request(url, 2, requestText, out int aid);
LGAGV_TaskResultRequest request = null;
try
{
if (jobj == null)
{
throw new Exception("请求参数不能为空");
}
request = JsonConvert.DeserializeObject<LGAGV_TaskResultRequest>(requestText);
if (request == null)
{
throw new Exception("请求参数格式不正确");
}
if (string.IsNullOrWhiteSpace(request.requestTaskId))
{
throw new Exception("任务ID(requestTaskId)不能为空");
}
bool isSuccess = IsAgvSuccess(request.status);
var param = new SqlParameter[]
{
new SqlParameter("@requestTaskId", request.requestTaskId ?? ""),
new SqlParameter("@status", request.status ?? ""),
new SqlParameter("@agvNo", request.agvNo ?? ""),
new SqlParameter("@message", request.message ?? ""),
new SqlParameter("@materialCode", request.materialCode ?? "")
};
ExecuteResultProcedure("LG_AGV_库位Moby_任务结果", ref param);
SaveInterfaceRecord("TaskResult", DirectionAgvToMes, null, null,
request.requestTaskId, null, null, null, request.materialCode, request.agvNo, request.status,
requestText, "", isSuccess ? 1 : 2, request.message ?? "");
SaveMesLog("LGAGV_TaskResult", $"临工AGV任务结果requestTaskId={request.requestTaskId}, status={request.status}, AGV={request.agvNo}, message={request.message}", MesLogType.INFO);
}
catch (Exception ex)
{
result = LGAGV_Response.Fail(ex.Message);
SaveInterfaceRecord("TaskResult", DirectionAgvToMes, null, null,
request?.requestTaskId, null, null, null, request?.materialCode, request?.agvNo, request?.status,
requestText, "", 2, ex.Message);
SaveMesLog("LGAGV_TaskResult", ex.Message, MesLogType.ERROR);
}
string responseText = JsonConvert.SerializeObject(result);
SaveLog_Interface_Response(responseText, aid);
return responseText;
}
public static void SaveInterfaceRecord(string interfaceName, string direction, string positionCode, string workStation,
string requestTaskId, string requestId, string position, int? type, string materialCode, string agvNo, string status,
string requestText, string responseText, int isSuccess, string errorMessage)
{
var param = new SqlParameter[]
{
new SqlParameter("@库位号", positionCode ?? ""),
new SqlParameter("@工位号", workStation ?? ""),
new SqlParameter("@接口名称", interfaceName ?? ""),
new SqlParameter("@接口方向", direction ?? ""),
new SqlParameter("@requestTaskId", requestTaskId ?? ""),
new SqlParameter("@requestId", requestId ?? ""),
new SqlParameter("@position", position ?? ""),
new SqlParameter("@type", type.HasValue ? (object)type.Value : DBNull.Value),
new SqlParameter("@materialCode", materialCode ?? ""),
new SqlParameter("@agvNo", agvNo ?? ""),
new SqlParameter("@status", status ?? ""),
new SqlParameter("@message", errorMessage ?? ""),
new SqlParameter("@请求报文", requestText ?? ""),
new SqlParameter("@响应报文", responseText ?? ""),
new SqlParameter("@是否成功", isSuccess),
new SqlParameter("@错误信息", errorMessage ?? "")
};
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure("LG_AGV_接口记录_增加", ref param, out string errMessage);
if (!string.IsNullOrEmpty(errMessage))
{
SaveMesLog("LGAGV_InterfaceRecord", errMessage, MesLogType.ERROR);
}
}
public static bool IsAgvSuccess(string codeOrStatus)
{
string value = (codeOrStatus ?? "").Trim().ToLower();
return value == "0" || value == "200" || value == "true" || value == "success" || value == "成功";
}
private static LGAGV_CallResult PostToAgv(string interfaceName, string path, object request,
string requestTaskId, string requestId, string position, int? type, string materialCode, string agvNo)
{
string baseUrl = ConfigurationManager.AppSettings["LGAGV_BaseUrl"];
if (string.IsNullOrWhiteSpace(baseUrl))
{
throw new Exception("未配置 LGAGV_BaseUrl");
}
string interfaceUrl = baseUrl.TrimEnd('/') + path;
string requestText = JsonConvert.SerializeObject(request);
SaveLog_Interface_Request("LGAGV_" + interfaceName, 1, requestText, out int aid);
string responseText = Post.Post_Auto(interfaceUrl, requestText);
SaveLog_Interface_Response(responseText, aid);
JObject response = ParseResponse(responseText);
string codeText = response["code"]?.ToString() ?? response["result"]?.ToString() ?? "";
string message = response["desc"]?.ToString() ?? response["message"]?.ToString() ?? response["msg"]?.ToString() ?? "";
bool success = IsAgvSuccess(codeText);
if (response["success"] != null)
{
if (bool.TryParse(response["success"].ToString(), out bool successValue))
{
success = successValue;
}
}
SaveInterfaceRecord(interfaceName, DirectionMesToAgv, position, position, requestTaskId, requestId, position,
type, materialCode, agvNo, codeText, requestText, responseText, success ? 1 : 2, success ? "" : message);
if (success)
{
SaveMesLog("LGAGV_" + interfaceName, $"临工AGV接口调用成功{interfaceName}, position={position}, requestTaskId={requestTaskId}", MesLogType.INFO);
}
else
{
SaveMesLog("LGAGV_" + interfaceName, $"临工AGV接口调用失败{interfaceName}, code={codeText}, message={message}", MesLogType.ERROR);
}
return new LGAGV_CallResult
{
Success = success,
Code = ToInt(codeText, success ? 0 : 500),
Message = message,
InterfaceUrl = interfaceUrl,
RequestText = requestText,
ResponseText = responseText,
Response = response
};
}
private static JObject ParseResponse(string responseText)
{
if (string.IsNullOrWhiteSpace(responseText))
{
return new JObject
{
{ "code", 500 },
{ "message", "AGV返回空响应" },
{ "success", false }
};
}
try
{
return JObject.Parse(responseText);
}
catch (Exception ex)
{
return new JObject
{
{ "code", 500 },
{ "message", "AGV返回非JSON响应" + ex.Message },
{ "raw", responseText },
{ "success", false }
};
}
}
private static int ToInt(string value, int defaultValue)
{
if (int.TryParse(value, out int intValue))
{
return intValue;
}
return defaultValue;
}
private static void ExecuteResultProcedure(string procedureName, ref SqlParameter[] param)
{
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure(procedureName, ref param, out DataTable dt, out string errMessage);
if (!string.IsNullOrEmpty(errMessage))
{
throw new Exception(errMessage);
}
if (dt != null && dt.Rows.Count > 0 && dt.Columns.Contains("result") && dt.Rows[0]["result"].ToString() != "1")
{
string msg = dt.Columns.Contains("msg") ? dt.Rows[0]["msg"].ToString() : "存储过程执行失败";
throw new Exception(msg);
}
}
}
}

View File

@@ -0,0 +1,106 @@
using Newtonsoft.Json.Linq;
namespace MisDataSaveDate
{
/// <summary>
/// 临工AGV两点任务请求。
/// </summary>
public class LGAGV_AddTaskRequest
{
public string requestTaskId { get; set; }
public string startPosition { get; set; }
public string endPosition { get; set; }
public string materialCode { get; set; }
}
/// <summary>
/// 临工AGV三点任务请求。
/// </summary>
public class LGAGV_AddTask2Request
{
public string requestTaskId { get; set; }
public string startPosition { get; set; }
public string midPosition { get; set; }
public string endPosition { get; set; }
public string materialCode { get; set; }
}
/// <summary>
/// 临工AGV放行请求。
/// </summary>
public class LGAGV_AllowLeaveRequest
{
public string requestId { get; set; }
public string position { get; set; }
public string agvNo { get; set; }
public int allowLeave { get; set; } = 1;
}
/// <summary>
/// 临工AGV到达/离开回调。
/// </summary>
public class LGAGV_StatusUpdateRequest
{
public string requestId { get; set; }
public string position { get; set; }
public int type { get; set; }
public string materialCode { get; set; }
public string agvNo { get; set; }
}
/// <summary>
/// 临工AGV任务执行结果回调。
/// </summary>
public class LGAGV_TaskResultRequest
{
public string requestTaskId { get; set; }
public string status { get; set; }
public string agvNo { get; set; }
public string message { get; set; }
public string materialCode { get; set; }
}
/// <summary>
/// 返回给临工AGV的通用响应。
/// </summary>
public class LGAGV_Response
{
public int code { get; set; }
public string desc { get; set; }
public bool success { get; set; }
public static LGAGV_Response Success(string desc = "成功")
{
return new LGAGV_Response
{
code = 0,
desc = desc,
success = true
};
}
public static LGAGV_Response Fail(string desc)
{
return new LGAGV_Response
{
code = 1,
desc = desc,
success = false
};
}
}
/// <summary>
/// MES调用临工AGV接口后的内部结果。
/// </summary>
public class LGAGV_CallResult
{
public bool Success { get; set; }
public int Code { get; set; }
public string Message { get; set; }
public string InterfaceUrl { get; set; }
public string RequestText { get; set; }
public string ResponseText { get; set; }
public JObject Response { get; set; }
}
}

View File

@@ -0,0 +1,836 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using MesServerWork;
using MisDataSaveDate.Helper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using static MisDataSaveDate.Helper.ApiLogHelper;
namespace MisDataSaveDate
{
/// <summary>
/// TCS插拔任务业务处理。PLC自动任务与Web人工任务共用此入口。
/// </summary>
public class TCSAGV_BusinessLogic
{
private const string TaskTypeCombined = "nav_action_program";
private const string TaskTypeProgram = "program";
public static TCSAGV_CallResult DispatchStationTask(string stationCode, string actionType,
string portCombination, string source, string operatorCode, string parentExternalCode, bool notifyPlc)
{
TCSAGV_Config config = ReadConfig(true);
TCSAGV_PointConfig point = ReadPointConfig(stationCode);
string normalizedAction = NormalizeAction(actionType);
string productModel = "";
string combination;
if (string.IsNullOrWhiteSpace(portCombination))
{
productModel = ReadCurrentProductModel(point.StationCode);
combination = ReadModelActionCombination(point.LineCode, productModel, normalizedAction);
}
else
{
combination = NormalizePortCombination(portCombination);
}
JArray parameters = new JArray
{
new JObject { { "workStation", point.WorkStation } }
};
if (combination.Contains("XSD"))
{
parameters.Add(new JObject
{
{ "programName", normalizedAction == "插" ? point.InsertXsdProgram : point.PullXsdProgram }
});
}
if (combination.Contains("XSE"))
{
parameters.Add(new JObject
{
{ "programName", normalizedAction == "插" ? point.InsertXseProgram : point.PullXseProgram }
});
}
string externalCode = CreateExternalCode(normalizedAction == "插" ? "PLUG" : "PULL");
return CreateAndSendTask(config, point, externalCode, parentExternalCode, normalizedAction, "",
productModel, combination, TaskTypeCombined, parameters.ToString(Formatting.None), source,
operatorCode, notifyPlc);
}
public static TCSAGV_CallResult DispatchSingleStep(string stationCode, string programName,
string operatorCode, string parentExternalCode)
{
TCSAGV_Config config = ReadConfig(true);
TCSAGV_PointConfig point = ReadPointConfig(stationCode);
EnsureRobotAtPoint(config, point);
string normalizedProgram = (programName ?? "").Trim();
if (!IsConfiguredProgram(point, normalizedProgram))
{
throw new Exception("所选programName不属于该工位配置");
}
string action = normalizedProgram.Contains("拔") ? "拔-单步" : "插-单步";
JArray parameters = new JArray
{
new JObject { { "programName", normalizedProgram } }
};
return CreateAndSendTask(config, point, CreateExternalCode("STEP"), parentExternalCode,
action, normalizedProgram, "", normalizedProgram.Contains("XSD") ? "XSD" : "XSE",
TaskTypeProgram, parameters.ToString(Formatting.None),
"MANUAL", operatorCode, false);
}
public static TCSAGV_CallResult RetryTask(string externalCode, string operatorCode)
{
DataRow original = ReadTask(externalCode);
if (!IsFailureStatus(ToInt(original["任务状态"], -1)))
{
throw new Exception("仅任务错误状态允许整单重发");
}
if (ToBool(original["处理状态"]))
{
throw new Exception("失败任务已处理,不能再次重发");
}
if (!ToBool(original["已复位"]))
{
throw new Exception("请先复位移动机器人再重发任务");
}
TCSAGV_Config config = ReadConfig(true);
TCSAGV_PointConfig point = ReadPointConfig(Convert.ToString(original["MES工位号"]));
string action = Convert.ToString(original["任务动作"]);
string programName = Convert.ToString(original["ProgramName"]);
string productModel = Convert.ToString(original["产品型号"]);
string combination = Convert.ToString(original["动作组合"]);
string taskType = Convert.ToString(original["任务类型"]);
string param = Convert.ToString(original["参数"]);
return CreateAndSendTask(config, point, CreateExternalCode("RETRY"), externalCode,
action, programName, productModel, combination, taskType, param, "RETRY", operatorCode, false);
}
public static TCSAGV_CallResult CancelTask(string externalCode, string operatorCode)
{
if (string.IsNullOrWhiteSpace(externalCode))
{
throw new Exception("外部任务编号不能为空");
}
TCSAGV_Config config = ReadConfig(true);
TCSAGV_CallResult result = GetFromTcs(config, "cancelExternalBusinessTask",
"/api/cancelExternalBusinessTask", new Dictionary<string, string> { { "externalCode", externalCode } });
if (result.Success)
{
SetLocalTaskStatus(externalCode, 3, "已取消", "");
}
SaveOperation(externalCode, "", "取消任务", operatorCode, result.RequestText,
result.ResponseText, result.Success, result.Message);
return result;
}
public static TCSAGV_CallResult StopPendingTasks(string externalCode, string operatorCode)
{
TCSAGV_Config config = ReadConfig(true);
TCSAGV_CallResult result = GetFromTcs(config, "stopExternalBusinessTask",
"/api/stopExternalBusinessTask", null);
if (result.Success && !string.IsNullOrWhiteSpace(externalCode))
{
DataRow task = ReadTask(externalCode);
if (ToInt(task["任务状态"], -1) == 0)
{
SetLocalTaskStatus(externalCode, 3, "已停止", "停止全部未开始任务");
}
}
SaveOperation(externalCode, "", "停止未开始任务", operatorCode, result.RequestText,
result.ResponseText, result.Success, result.Message);
return result;
}
public static TCSAGV_CallResult ResetRobot(string externalCode, string ip, string operatorCode)
{
TCSAGV_Config config = ReadConfig(true);
string robotIp = string.IsNullOrWhiteSpace(ip) ? config.McrIp : ip.Trim();
if (string.IsNullOrWhiteSpace(robotIp))
{
throw new Exception("未配置AGV IP");
}
TCSAGV_CallResult result = GetFromTcs(config, "reset", "/api/reset",
new Dictionary<string, string> { { "ip", robotIp } });
if (result.Success && !string.IsNullOrWhiteSpace(externalCode))
{
try
{
SqlParameter[] parameters =
{
new SqlParameter("@外部任务编号", externalCode.Trim())
};
EnsureBusinessSuccess(ExecuteProcedure("XD_TCS_AGV_任务_复位标记", parameters));
}
catch (Exception ex)
{
SaveOperation(externalCode, "", "移动机器人复位", operatorCode, result.RequestText,
result.ResponseText, false, "TCS复位成功但MES复位标记失败" + ex.Message);
throw;
}
}
SaveOperation(externalCode, "", "移动机器人复位", operatorCode, result.RequestText,
result.ResponseText, result.Success, result.Message);
return result;
}
public static TCSAGV_CallResult StopNow(string externalCode, string ip, string operatorCode)
{
TCSAGV_Config config = ReadConfig(true);
string robotIp = string.IsNullOrWhiteSpace(ip) ? config.McrIp : ip.Trim();
if (string.IsNullOrWhiteSpace(robotIp))
{
throw new Exception("未配置AGV IP");
}
TCSAGV_CallResult result = GetFromTcs(config, "stopNow", "/api/stopNow",
new Dictionary<string, string> { { "ip", robotIp } });
if (result.Success && !string.IsNullOrWhiteSpace(externalCode))
{
SetLocalTaskStatus(externalCode, 4, "任务错误", "人工紧急停止");
}
SaveOperation(externalCode, "", "紧急停止", operatorCode, result.RequestText,
result.ResponseText, result.Success, result.Message);
return result;
}
public static TCSAGV_CallResult SyncTaskStatus(string externalCode, string operatorCode)
{
TCSAGV_Config config = ReadConfig(true);
TCSAGV_CallResult result = GetFromTcs(config, "getExternalBusinessTaskStatus",
"/api/getExternalBusinessTaskStatus", new Dictionary<string, string> { { "externalCode", externalCode } });
if (result.Success)
{
JObject task = FirstResultObject(result.Response);
if (task != null && task["status"] != null)
{
int status = ToInt(task["status"], -1);
if (status >= 0 && status <= 5)
{
UpdateTaskStatus(externalCode, status,
Convert.ToString(task["ip"] ?? ""), Convert.ToString(task["type"] ?? ""),
Convert.ToString(task["beginTime"] ?? ""), Convert.ToString(task["endTime"] ?? ""),
Convert.ToString(task["remark"] ?? ""));
}
}
}
SaveOperation(externalCode, "", "同步任务状态", operatorCode, result.RequestText,
result.ResponseText, result.Success, result.Message);
return result;
}
public static TCSAGV_CallResult QueryRobotInfo()
{
TCSAGV_Config config = ReadConfig(true);
return QueryRobotInfo(config);
}
private static TCSAGV_CallResult QueryRobotInfo(TCSAGV_Config config)
{
Dictionary<string, string> query = new Dictionary<string, string>
{
{ "mcrGroup", config.McrGroup }
};
if (!string.IsNullOrWhiteSpace(config.McrIp))
{
query.Add("mcrIp", config.McrIp);
}
return GetFromTcs(config, "getMcrInfo", "/api/getMcrInfo", query);
}
public static void HandleFailure(string externalCode, string operatorCode, string remark, bool notifyPlc)
{
DataRow task = ReadTask(externalCode);
if (!IsFailureStatus(ToInt(task["任务状态"], -1)))
{
throw new Exception("仅任务错误状态允许人工处理");
}
if (!ToBool(task["已复位"]))
{
throw new Exception("请先复位移动机器人再完成人工处理");
}
if (string.IsNullOrWhiteSpace(remark))
{
throw new Exception("处理说明不能为空");
}
if (notifyPlc)
{
WritePlcCompletion(task);
}
SqlParameter[] parameters =
{
new SqlParameter("@外部任务编号", externalCode ?? ""),
new SqlParameter("@处理人", operatorCode ?? ""),
new SqlParameter("@处理说明", remark ?? "")
};
EnsureBusinessSuccess(ExecuteProcedure("XD_TCS_AGV_任务_人工处理", parameters));
SaveOperation(externalCode, Convert.ToString(task["MES工位号"]), "失败任务人工处理",
operatorCode, "", "", true, remark);
}
public static string ProcessTaskStatus(string url, [FromBody] JObject jobj)
{
string requestText = jobj == null ? "" : jobj.ToString(Formatting.None);
SaveLog_Interface_Request(url, 2, requestText, out int aid);
TCSAGV_ApiResponse response;
try
{
if (jobj == null)
{
throw new Exception("请求参数不能为空");
}
TCSAGV_TaskStatusPushRequest request = jobj.ToObject<TCSAGV_TaskStatusPushRequest>();
if (request == null || string.IsNullOrWhiteSpace(request.externalCode))
{
throw new Exception("外部任务编号不能为空");
}
int status = ToInt(request.status, -1);
if (status < 0 || status > 5)
{
throw new Exception("任务状态必须为0至5");
}
UpdateTaskStatus(request.externalCode, status, request.ip, request.type,
request.beginTime, request.endTime, request.remark);
response = TCSAGV_ApiResponse.Ok("接收成功", "接收成功");
}
catch (Exception ex)
{
response = TCSAGV_ApiResponse.Fail(ex.Message);
SaveMesLog("TCS任务状态推送", ex.Message, MesLogType.ERROR);
}
string responseText = JsonConvert.SerializeObject(response);
SaveLog_Interface_Response(responseText, aid);
return responseText;
}
public static string ProcessPositionPush(string url, [FromBody] JObject jobj)
{
string requestText = jobj == null ? "" : jobj.ToString(Formatting.None);
SaveLog_Interface_Request(url, 2, requestText, out int aid);
TCSAGV_ApiResponse response;
try
{
if (jobj == null)
{
throw new Exception("请求参数不能为空");
}
TCSAGV_PositionPushRequest request = jobj.ToObject<TCSAGV_PositionPushRequest>();
if (request == null || string.IsNullOrWhiteSpace(request.ip))
{
throw new Exception("机器人IP不能为空");
}
SqlParameter[] parameters =
{
new SqlParameter("@机器人IP", request.ip ?? ""),
new SqlParameter("@当前站点", request.currentPos ?? ""),
new SqlParameter("@目标站点", request.objectivePos ?? ""),
new SqlParameter("@原始报文", requestText)
};
ExecuteProcedure("XD_TCS_AGV_位置_更新", parameters);
response = TCSAGV_ApiResponse.Ok("接收成功", "接收成功");
}
catch (Exception ex)
{
response = TCSAGV_ApiResponse.Fail(ex.Message);
SaveMesLog("TCS位置推送", ex.Message, MesLogType.ERROR);
}
string responseText = JsonConvert.SerializeObject(response);
SaveLog_Interface_Response(responseText, aid);
return responseText;
}
private static TCSAGV_CallResult CreateAndSendTask(TCSAGV_Config config, TCSAGV_PointConfig point,
string externalCode, string parentExternalCode, string action, string programName,
string productModel, string combination, string taskType, string param, string source,
string operatorCode, bool notifyPlc)
{
TCSAGV_TaskRequest request = new TCSAGV_TaskRequest
{
externalCode = externalCode,
type = taskType,
priority = config.DefaultPriority,
param = param,
mcrgroup = config.McrGroup,
mcrip = config.McrIp,
operatoruserid = config.OperatorUserId
};
SqlParameter[] createParameters =
{
new SqlParameter("@外部任务编号", externalCode),
new SqlParameter("@原任务编号", parentExternalCode ?? ""),
new SqlParameter("@MES工位号", point.StationCode),
new SqlParameter("@任务动作", action),
new SqlParameter("@产品型号", productModel ?? ""),
new SqlParameter("@动作组合", combination ?? ""),
new SqlParameter("@ProgramName", programName ?? ""),
new SqlParameter("@任务类型", taskType),
new SqlParameter("@参数", param),
new SqlParameter("@优先级", config.DefaultPriority),
new SqlParameter("@机器人组", config.McrGroup ?? ""),
new SqlParameter("@机器人IP", config.McrIp ?? ""),
new SqlParameter("@来源", source ?? ""),
new SqlParameter("@操作人", operatorCode ?? ""),
new SqlParameter("@是否通知PLC", notifyPlc)
};
EnsureBusinessSuccess(ExecuteProcedure("XD_TCS_AGV_任务_创建", createParameters));
TCSAGV_CallResult result;
try
{
result = PostToTcs(config, "createExternalBusinessTask", "/api/createExternalBusinessTask", request);
}
catch (Exception ex)
{
UpdateDispatchResult(externalCode, JsonConvert.SerializeObject(request), "", false, ex.Message);
SaveOperation(externalCode, point.StationCode, "下发" + action + "任务", operatorCode,
JsonConvert.SerializeObject(request), "", false, ex.Message);
throw;
}
UpdateDispatchResult(externalCode, result.RequestText, result.ResponseText, result.Success,
result.Success ? "" : result.Message);
SaveOperation(externalCode, point.StationCode, "下发" + action + "任务", operatorCode,
result.RequestText, result.ResponseText, result.Success, result.Message);
result.ExternalCode = externalCode;
return result;
}
private static void UpdateTaskStatus(string externalCode, int status, string ip, string type,
string beginTime, string endTime, string remark)
{
SqlParameter[] parameters =
{
new SqlParameter("@外部任务编号", externalCode ?? ""),
new SqlParameter("@任务状态", status),
new SqlParameter("@机器人IP", ip ?? ""),
new SqlParameter("@任务类型", type ?? ""),
new SqlParameter("@开始时间", beginTime ?? ""),
new SqlParameter("@结束时间", endTime ?? ""),
new SqlParameter("@备注", remark ?? "")
};
DataTable result = ExecuteProcedure("XD_TCS_AGV_任务_状态更新", parameters);
EnsureBusinessSuccess(result);
if (status == 2 && result.Rows.Count > 0 && ToBool(result.Rows[0]["是否通知PLC"])
&& !ToBool(result.Rows[0]["PLC已通知"]))
{
DataRow task = ReadTask(externalCode);
WritePlcCompletion(task);
SqlParameter[] notified = { new SqlParameter("@外部任务编号", externalCode) };
ExecuteProcedure("XD_TCS_AGV_任务_PLC通知完成", notified);
}
}
private static bool IsFailureStatus(int status)
{
return status == 4 || status == 5;
}
private static void WritePlcCompletion(DataRow task)
{
string stationCode = Convert.ToString(task["MES工位号"]);
string action = Convert.ToString(task["任务动作"]);
int tagCode = action.StartsWith("插", StringComparison.Ordinal) ? 400
: action.StartsWith("拔", StringComparison.Ordinal) ? 401 : 0;
if (tagCode == 0)
{
throw new Exception("任务动作无法确定PLC完成码");
}
if (!MIS_BASE.WritePLC(tagCode, stationCode, true))
{
throw new Exception("任务完成但PLC完成信号写入失败");
}
SaveMesLog(stationCode, "TCS任务完成已写入PLC功能码" + tagCode, MesLogType.INFO);
}
private static TCSAGV_Config ReadConfig(bool requireEnabled)
{
DataTable table = ExecuteProcedure("XD_TCS_AGV_配置_获取", new SqlParameter[0]);
if (table.Rows.Count == 0)
{
throw new Exception("未配置TCS参数");
}
DataRow row = table.Rows[0];
TCSAGV_Config config = new TCSAGV_Config
{
BaseUrl = Convert.ToString(row["TCS_BaseUrl"]),
Enabled = Convert.ToString(row["TCS_Enabled"]) == "1",
McrGroup = Convert.ToString(row["McrGroup"]),
McrIp = Convert.ToString(row["McrIp"]),
OperatorUserId = Convert.ToString(row["TCS_OperatorUserId"]),
DefaultPriority = ToInt(row["DefaultPriority"], 1),
HttpTimeoutSeconds = ToInt(row["HttpTimeoutSeconds"], 15)
};
if (string.IsNullOrWhiteSpace(config.BaseUrl))
{
throw new Exception("未配置TCS服务地址");
}
if (string.IsNullOrWhiteSpace(config.OperatorUserId))
{
throw new Exception("未配置TCS任务状态推送标识");
}
if (requireEnabled && !config.Enabled)
{
throw new Exception("TCS真实下发开关未启用请先确认现场地址和AGV IP");
}
return config;
}
private static TCSAGV_PointConfig ReadPointConfig(string stationCode)
{
if (string.IsNullOrWhiteSpace(stationCode))
{
throw new Exception("MES工位号不能为空");
}
SqlParameter[] parameters = { new SqlParameter("@MES工位号", stationCode.Trim()) };
DataTable table = ExecuteProcedure("XD_TCS_AGV_点位配置_查询", parameters);
if (table.Rows.Count == 0)
{
throw new Exception("MES工位未配置TCS站点和programName");
}
DataRow row = table.Rows[0];
return new TCSAGV_PointConfig
{
LineCode = Convert.ToString(row["产线代码"]),
StationCode = Convert.ToString(row["MES工位号"]),
PositionName = Convert.ToString(row["现场位置"]),
WorkStation = Convert.ToString(row["WorkStation"]),
InsertXsdProgram = Convert.ToString(row["插XSDProgramName"]),
InsertXseProgram = Convert.ToString(row["插XSEProgramName"]),
PullXsdProgram = Convert.ToString(row["拔XSDProgramName"]),
PullXseProgram = Convert.ToString(row["拔XSEProgramName"])
};
}
private static string ReadCurrentProductModel(string stationCode)
{
SqlParameter[] parameters = { new SqlParameter("@MES工位号", stationCode) };
DataTable table = ExecuteProcedure("XD_TCS_AGV_库位产品_查询", parameters);
string productModel = table.Rows.Count == 0 ? "" : Convert.ToString(table.Rows[0]["产品型号"]);
if (string.IsNullOrWhiteSpace(productModel))
{
throw new Exception("工位" + stationCode + "未获取到当前产品型号");
}
return productModel.Trim();
}
private static string ReadModelActionCombination(string lineCode, string productModel, string action)
{
SqlParameter[] parameters =
{
new SqlParameter("@产线代码", lineCode),
new SqlParameter("@产品型号", productModel),
new SqlParameter("@任务动作", action)
};
DataTable table = ExecuteProcedure("XD_TCS_AGV_型号动作映射_查询", parameters);
if (table.Rows.Count == 0)
{
throw new Exception("产品型号" + productModel + "未配置" + action + "动作组合");
}
return Convert.ToString(table.Rows[0]["动作组合"]);
}
private static DataRow ReadTask(string externalCode)
{
if (string.IsNullOrWhiteSpace(externalCode))
{
throw new Exception("外部任务编号不能为空");
}
SqlParameter[] parameters = { new SqlParameter("@外部任务编号", externalCode.Trim()) };
DataTable table = ExecuteProcedure("XD_TCS_AGV_任务_获取", parameters);
if (table.Rows.Count == 0)
{
throw new Exception("外部任务不存在");
}
return table.Rows[0];
}
private static void EnsureRobotAtPoint(TCSAGV_Config config, TCSAGV_PointConfig point)
{
TCSAGV_CallResult result = QueryRobotInfo(config);
if (!result.Success)
{
throw new Exception("查询AGV实时位置失败" + result.Message);
}
JObject robot = FirstResultObject(result.Response);
if (robot == null)
{
throw new Exception("未查询到AGV状态不能执行单步任务");
}
if (ToInt(robot["status"], -1) == 4)
{
throw new Exception("AGV当前未连接不能执行单步任务");
}
string currentPosition = Convert.ToString(robot["currentPos"]);
if (string.IsNullOrWhiteSpace(currentPosition))
{
throw new Exception("未获取到AGV当前位置不能执行单步任务");
}
if (!string.Equals(currentPosition, point.WorkStation, StringComparison.OrdinalIgnoreCase))
{
throw new Exception("AGV当前位置" + currentPosition + "与所选站点" + point.WorkStation + "不一致");
}
}
private static void UpdateDispatchResult(string externalCode, string requestText, string responseText,
bool success, string errorMessage)
{
SqlParameter[] parameters =
{
new SqlParameter("@外部任务编号", externalCode ?? ""),
new SqlParameter("@请求报文", requestText ?? ""),
new SqlParameter("@响应报文", responseText ?? ""),
new SqlParameter("@是否成功", success),
new SqlParameter("@错误信息", errorMessage ?? "")
};
ExecuteProcedure("XD_TCS_AGV_任务_下发结果更新", parameters);
}
private static void SetLocalTaskStatus(string externalCode, int status, string statusText, string errorMessage)
{
SqlParameter[] parameters =
{
new SqlParameter("@外部任务编号", externalCode ?? ""),
new SqlParameter("@任务状态", status),
new SqlParameter("@状态说明", statusText ?? ""),
new SqlParameter("@错误信息", errorMessage ?? "")
};
ExecuteProcedure("XD_TCS_AGV_任务_本地状态设置", parameters);
}
private static void SaveOperation(string externalCode, string stationCode, string operationType,
string operatorCode, string requestText, string responseText, bool success, string message)
{
try
{
SqlParameter[] parameters =
{
new SqlParameter("@外部任务编号", externalCode ?? ""),
new SqlParameter("@MES工位号", stationCode ?? ""),
new SqlParameter("@操作类型", operationType ?? ""),
new SqlParameter("@操作人", operatorCode ?? ""),
new SqlParameter("@请求报文", requestText ?? ""),
new SqlParameter("@响应报文", responseText ?? ""),
new SqlParameter("@是否成功", success),
new SqlParameter("@操作结果", message ?? "")
};
ExecuteProcedure("XD_TCS_AGV_操作记录_增加", parameters);
}
catch (Exception ex)
{
SaveMesLog("TCS操作记录", ex.Message, MesLogType.ERROR);
}
}
private static TCSAGV_CallResult PostToTcs(TCSAGV_Config config, string interfaceName,
string path, object request)
{
string url = config.BaseUrl.TrimEnd('/') + path;
string requestText = JsonConvert.SerializeObject(request);
SaveLog_Interface_Request("TCS_" + interfaceName, 1, requestText, out int aid);
string responseText;
using (HttpClient client = CreateHttpClient(config))
using (StringContent content = new StringContent(requestText, Encoding.UTF8, "application/json"))
{
HttpResponseMessage response = client.PostAsync(url, content).GetAwaiter().GetResult();
responseText = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
if (string.IsNullOrWhiteSpace(responseText) && !response.IsSuccessStatusCode)
{
responseText = "HTTP " + (int)response.StatusCode;
}
}
SaveLog_Interface_Response(responseText, aid);
return ParseCallResult(requestText, responseText);
}
private static TCSAGV_CallResult GetFromTcs(TCSAGV_Config config, string interfaceName,
string path, IDictionary<string, string> query)
{
StringBuilder url = new StringBuilder(config.BaseUrl.TrimEnd('/') + path);
JObject request = new JObject();
if (query != null && query.Count > 0)
{
url.Append('?');
bool first = true;
foreach (KeyValuePair<string, string> item in query)
{
if (!first) url.Append('&');
first = false;
url.Append(HttpUtility.UrlEncode(item.Key));
url.Append('=');
url.Append(HttpUtility.UrlEncode(item.Value ?? ""));
request[item.Key] = item.Value ?? "";
}
}
string requestText = request.ToString(Formatting.None);
bool skipInterfaceLog = string.Equals(interfaceName, "getMcrInfo",
StringComparison.OrdinalIgnoreCase);
int aid = 0;
if (!skipInterfaceLog)
{
SaveLog_Interface_Request("TCS_" + interfaceName, 1, requestText, out aid);
}
string responseText;
using (HttpClient client = CreateHttpClient(config))
{
HttpResponseMessage response = client.GetAsync(url.ToString()).GetAwaiter().GetResult();
responseText = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
if (string.IsNullOrWhiteSpace(responseText) && !response.IsSuccessStatusCode)
{
responseText = "HTTP " + (int)response.StatusCode;
}
}
if (!skipInterfaceLog)
{
SaveLog_Interface_Response(responseText, aid);
}
return ParseCallResult(requestText, responseText);
}
private static HttpClient CreateHttpClient(TCSAGV_Config config)
{
return new HttpClient
{
Timeout = TimeSpan.FromSeconds(config.HttpTimeoutSeconds > 0 ? config.HttpTimeoutSeconds : 15)
};
}
private static TCSAGV_CallResult ParseCallResult(string requestText, string responseText)
{
JObject response;
try
{
response = JObject.Parse(responseText ?? "");
}
catch (Exception ex)
{
return new TCSAGV_CallResult
{
Success = false,
Code = 500,
Message = "TCS返回非JSON响应" + ex.Message,
RequestText = requestText,
ResponseText = responseText,
Response = null
};
}
bool successFlag = false;
bool hasSuccessFlag = response["success"] != null;
if (hasSuccessFlag)
{
bool.TryParse(Convert.ToString(response["success"]), out successFlag);
}
int code = ToInt(response["code"], successFlag ? 200 : 500);
bool success = hasSuccessFlag ? successFlag && code == 200 : code == 200;
string message = Convert.ToString(response["message"] ?? response["msg"] ?? response["result"] ?? "");
return new TCSAGV_CallResult
{
Success = success,
Code = code,
Message = message,
RequestText = requestText,
ResponseText = responseText,
Response = response
};
}
private static JObject FirstResultObject(JObject response)
{
if (response == null || response["result"] == null) return null;
JToken result = response["result"];
if (result.Type == JTokenType.Array)
{
JArray array = (JArray)result;
return array.Count > 0 ? array[0] as JObject : null;
}
return result as JObject;
}
private static DataTable ExecuteProcedure(string procedureName, SqlParameter[] parameters)
{
SqlParameter[] procedureParameters = parameters ?? new SqlParameter[0];
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure(procedureName, ref procedureParameters,
out DataTable table, out string errorMessage);
if (!string.IsNullOrWhiteSpace(errorMessage))
{
throw new Exception(errorMessage);
}
return table ?? new DataTable();
}
private static void EnsureBusinessSuccess(DataTable table)
{
if (table == null || table.Rows.Count == 0)
{
throw new Exception("数据库未返回业务结果");
}
if (ToInt(table.Rows[0]["result"], 0) != 1)
{
string message = table.Columns.Contains("msg") ? Convert.ToString(table.Rows[0]["msg"]) : "业务操作失败";
throw new Exception(message);
}
}
private static string NormalizeAction(string actionType)
{
string value = (actionType ?? "").Trim();
if (value == "插" || value.Equals("plug", StringComparison.OrdinalIgnoreCase)) return "插";
if (value == "拔" || value.Equals("pull", StringComparison.OrdinalIgnoreCase)) return "拔";
throw new Exception("任务动作只支持插或拔");
}
private static string NormalizePortCombination(string portCombination)
{
string value = (portCombination ?? "").Trim().ToUpperInvariant();
if (value == "XSD" || value == "XSE" || value == "XSD+XSE") return value;
throw new Exception("动作组合只支持XSD、XSE或XSD+XSE");
}
private static bool IsConfiguredProgram(TCSAGV_PointConfig point, string programName)
{
return programName == point.InsertXsdProgram || programName == point.InsertXseProgram
|| programName == point.PullXsdProgram || programName == point.PullXseProgram;
}
private static string CreateExternalCode(string prefix)
{
return "XD_" + prefix + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "_"
+ Guid.NewGuid().ToString("N").Substring(0, 6).ToUpperInvariant();
}
private static int ToInt(object value, int defaultValue)
{
int result;
return int.TryParse(Convert.ToString(value), out result) ? result : defaultValue;
}
private static bool ToBool(object value)
{
string text = Convert.ToString(value);
return text == "1" || text.Equals("true", StringComparison.OrdinalIgnoreCase);
}
}
}

View File

@@ -0,0 +1,133 @@
using Newtonsoft.Json.Linq;
namespace MisDataSaveDate
{
public class TCSAGV_TaskRequest
{
public string externalCode { get; set; }
public string type { get; set; }
public int priority { get; set; }
public string param { get; set; }
public string mcrgroup { get; set; }
public string mcrip { get; set; }
public string operatoruserid { get; set; }
}
public class TCSAGV_TaskStatusPushRequest
{
public string externalCode { get; set; }
public string status { get; set; }
public string ip { get; set; }
public string type { get; set; }
public string beginTime { get; set; }
public string endTime { get; set; }
public string remark { get; set; }
}
public class TCSAGV_PositionPushRequest
{
public string ip { get; set; }
public string currentPos { get; set; }
public string objectivePos { get; set; }
}
public class TCSAGV_StationDispatchRequest
{
public string stationCode { get; set; }
public string actionType { get; set; }
public string portCombination { get; set; }
public string operatorCode { get; set; }
public string parentExternalCode { get; set; }
}
public class TCSAGV_StepDispatchRequest
{
public string stationCode { get; set; }
public string programName { get; set; }
public string operatorCode { get; set; }
public string parentExternalCode { get; set; }
}
public class TCSAGV_TaskOperationRequest
{
public string externalCode { get; set; }
public string operatorCode { get; set; }
public string remark { get; set; }
public bool notifyPlc { get; set; }
}
public class TCSAGV_RobotOperationRequest
{
public string externalCode { get; set; }
public string ip { get; set; }
public string operatorCode { get; set; }
public string remark { get; set; }
}
public class TCSAGV_Config
{
public string BaseUrl { get; set; }
public bool Enabled { get; set; }
public string McrGroup { get; set; }
public string McrIp { get; set; }
public string OperatorUserId { get; set; }
public int DefaultPriority { get; set; }
public int HttpTimeoutSeconds { get; set; }
}
public class TCSAGV_PointConfig
{
public string LineCode { get; set; }
public string StationCode { get; set; }
public string PositionName { get; set; }
public string WorkStation { get; set; }
public string InsertXsdProgram { get; set; }
public string InsertXseProgram { get; set; }
public string PullXsdProgram { get; set; }
public string PullXseProgram { get; set; }
}
public class TCSAGV_CallResult
{
public bool Success { get; set; }
public int Code { get; set; }
public string Message { get; set; }
public string ExternalCode { get; set; }
public string RequestText { get; set; }
public string ResponseText { get; set; }
public JObject Response { get; set; }
}
public class TCSAGV_ApiResponse
{
public bool success { get; set; }
public int code { get; set; }
public string message { get; set; }
public object data { get; set; }
public long timestamp { get; set; }
public static TCSAGV_ApiResponse Ok(string message, object data = null)
{
return new TCSAGV_ApiResponse
{
success = true,
code = 200,
message = message,
data = data,
timestamp = System.DateTimeOffset.Now.ToUnixTimeMilliseconds()
};
}
public static TCSAGV_ApiResponse Fail(string message)
{
return new TCSAGV_ApiResponse
{
success = false,
code = 500,
message = message,
data = null,
timestamp = System.DateTimeOffset.Now.ToUnixTimeMilliseconds()
};
}
}
}

View File

@@ -40,5 +40,202 @@ namespace MisDataSaveDate
};
}
/// <summary>
/// 临工AGV到达/离开状态回调接口。
/// </summary>
/// <param name="jobj">临工AGV状态回调数据</param>
/// <returns>处理结果</returns>
[HttpPost]
[Route("agv/lgagv/statusUpdate")]
public HttpResponseMessage LGAGV_StatusUpdate([FromBody] JObject jobj)
{
return new HttpResponseMessage
{
Content = new StringContent(LGAGV_BusinessLogic.ProcessStatusUpdate(headUrl + System.Reflection.MethodBase.GetCurrentMethod().Name, jobj), Encoding.GetEncoding("UTF-8"), "application/json")
};
}
/// <summary>
/// 临工AGV任务结果回调接口。
/// </summary>
/// <param name="jobj">临工AGV任务结果数据</param>
/// <returns>处理结果</returns>
[HttpPost]
[Route("agv/lgagv/taskResult")]
public HttpResponseMessage LGAGV_TaskResult([FromBody] JObject jobj)
{
return new HttpResponseMessage
{
Content = new StringContent(LGAGV_BusinessLogic.ProcessTaskResult(headUrl + System.Reflection.MethodBase.GetCurrentMethod().Name, jobj), Encoding.GetEncoding("UTF-8"), "application/json")
};
}
[HttpPost]
[Route("api/reportExternalBusinessTaskStatus")]
public HttpResponseMessage TCS_ReportExternalBusinessTaskStatus([FromBody] JObject jobj)
{
return JsonResponse(TCSAGV_BusinessLogic.ProcessTaskStatus("api/reportExternalBusinessTaskStatus", jobj));
}
[HttpPost]
[Route("api/mcrInfoLocation")]
public HttpResponseMessage TCS_McrInfoLocation([FromBody] JObject jobj)
{
return JsonResponse(TCSAGV_BusinessLogic.ProcessPositionPush("api/mcrInfoLocation", jobj));
}
[HttpPost]
[Route("agv/tcs/dispatchStation")]
public HttpResponseMessage TCS_DispatchStation([FromBody] TCSAGV_StationDispatchRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
if (string.IsNullOrWhiteSpace(request.portCombination)) throw new Exception("请选择动作组合");
TCSAGV_CallResult result = TCSAGV_BusinessLogic.DispatchStationTask(
request.stationCode, request.actionType, request.portCombination, "MANUAL", request.operatorCode,
request.parentExternalCode, false);
return result.Success
? TCSAGV_ApiResponse.Ok("任务下发成功", result)
: TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/dispatchStep")]
public HttpResponseMessage TCS_DispatchStep([FromBody] TCSAGV_StepDispatchRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
TCSAGV_CallResult result = TCSAGV_BusinessLogic.DispatchSingleStep(
request.stationCode, request.programName, request.operatorCode, request.parentExternalCode);
return result.Success
? TCSAGV_ApiResponse.Ok("单步任务下发成功", result)
: TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/retry")]
public HttpResponseMessage TCS_Retry([FromBody] TCSAGV_TaskOperationRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
TCSAGV_CallResult result = TCSAGV_BusinessLogic.RetryTask(request.externalCode, request.operatorCode);
return result.Success
? TCSAGV_ApiResponse.Ok("整单重发成功", result)
: TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/cancel")]
public HttpResponseMessage TCS_Cancel([FromBody] TCSAGV_TaskOperationRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
TCSAGV_CallResult result = TCSAGV_BusinessLogic.CancelTask(request.externalCode, request.operatorCode);
return result.Success ? TCSAGV_ApiResponse.Ok("任务取消成功", result) : TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/stopPending")]
public HttpResponseMessage TCS_StopPending([FromBody] TCSAGV_TaskOperationRequest request)
{
return ExecuteTcs(() =>
{
string externalCode = request == null ? "" : request.externalCode;
string operatorCode = request == null ? "" : request.operatorCode;
TCSAGV_CallResult result = TCSAGV_BusinessLogic.StopPendingTasks(externalCode, operatorCode);
return result.Success ? TCSAGV_ApiResponse.Ok("未开始任务已停止", result) : TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/reset")]
public HttpResponseMessage TCS_Reset([FromBody] TCSAGV_RobotOperationRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
TCSAGV_CallResult result = TCSAGV_BusinessLogic.ResetRobot(
request.externalCode, request.ip, request.operatorCode);
return result.Success ? TCSAGV_ApiResponse.Ok("移动机器人复位成功", result) : TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/stopNow")]
public HttpResponseMessage TCS_StopNow([FromBody] TCSAGV_RobotOperationRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
TCSAGV_CallResult result = TCSAGV_BusinessLogic.StopNow(
request.externalCode, request.ip, request.operatorCode);
return result.Success ? TCSAGV_ApiResponse.Ok("移动机器人已紧急停止", result) : TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/syncTask")]
public HttpResponseMessage TCS_SyncTask([FromBody] TCSAGV_TaskOperationRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
TCSAGV_CallResult result = TCSAGV_BusinessLogic.SyncTaskStatus(request.externalCode, request.operatorCode);
return result.Success ? TCSAGV_ApiResponse.Ok("任务状态同步成功", result) : TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpGet]
[Route("agv/tcs/queryRobot")]
public HttpResponseMessage TCS_QueryRobot()
{
return ExecuteTcs(() =>
{
TCSAGV_CallResult result = TCSAGV_BusinessLogic.QueryRobotInfo();
return result.Success ? TCSAGV_ApiResponse.Ok("机器人状态查询成功", result.Response) : TCSAGV_ApiResponse.Fail(result.Message);
});
}
[HttpPost]
[Route("agv/tcs/handleFailure")]
public HttpResponseMessage TCS_HandleFailure([FromBody] TCSAGV_TaskOperationRequest request)
{
return ExecuteTcs(() =>
{
if (request == null) throw new Exception("请求参数不能为空");
TCSAGV_BusinessLogic.HandleFailure(request.externalCode, request.operatorCode, request.remark, request.notifyPlc);
return TCSAGV_ApiResponse.Ok("失败任务已人工处理");
});
}
private static HttpResponseMessage ExecuteTcs(Func<TCSAGV_ApiResponse> action)
{
TCSAGV_ApiResponse response;
try
{
response = action();
}
catch (Exception ex)
{
response = TCSAGV_ApiResponse.Fail(ex.Message);
}
return JsonResponse(JsonConvert.SerializeObject(response));
}
private static HttpResponseMessage JsonResponse(string json)
{
return new HttpResponseMessage
{
Content = new StringContent(json, Encoding.GetEncoding("UTF-8"), "application/json")
};
}
}
}

View File

@@ -99,6 +99,36 @@ namespace MisDataSaveDate
};
}
/// <summary>
/// 临工AGV网页按钮调度接口。
/// </summary>
/// <param name="jobj">调度请求数据</param>
/// <returns>处理结果</returns>
[HttpPost]
[Route("web/LGAGV_Dispatch")]
public HttpResponseMessage LGAGV_Dispatch([FromBody] JObject jobj)
{
return new HttpResponseMessage
{
Content = new StringContent(LGWEB_BusinessLogic.WEB_DispatchAGV(headUrl + System.Reflection.MethodBase.GetCurrentMethod().Name, jobj), Encoding.GetEncoding("UTF-8"), "application/json")
};
}
/// <summary>
/// 临工AGV网页按钮放行接口。
/// </summary>
/// <param name="jobj">放行请求数据</param>
/// <returns>处理结果</returns>
[HttpPost]
[Route("web/LGAGV_AllowLeave")]
public HttpResponseMessage LGAGV_AllowLeave([FromBody] JObject jobj)
{
return new HttpResponseMessage
{
Content = new StringContent(LGWEB_BusinessLogic.WEB_AllowLeave(headUrl + System.Reflection.MethodBase.GetCurrentMethod().Name, jobj), Encoding.GetEncoding("UTF-8"), "application/json")
};
}
/// <summary>
/// 批量读取PLC点位值接口
/// 前端传递TagTypeCodeID数组和工位号返回对应点位的值

View File

@@ -1,4 +1,4 @@
using DataLinkMesWork;
using DataLinkMesWork;
using MesServerWork;
using MisDataFunDll;
using MisDataSaveDate.MOM;
@@ -24,6 +24,17 @@ namespace WebApi
{
public class CALL_Inerface_DataHandle
{
private static bool TryCheckProcessReportAllowed(string opName, string engineID, string orderForm, string reqType)
{
DataTable isSendDT = MisDataFun.IOT_ReqData_UpLoad_IsSend(opName, orderForm, reqType, engineID);
if (isSendDT.Rows[0]["result"].ToString() != "1")
{
SaveMesLog($"工序{reqType}", isSendDT.Rows[0]["msg"].ToString(), MesLogType.ERROR);
return false;
}
return true;
}
/// <summary>
/// 开工(工序)
/// </summary>
@@ -32,19 +43,17 @@ namespace WebApi
/// <param name="OrderForm"></param>
public static void CALL_Inerface_JobStart(string OpName, string EngineID, string OrderForm)
{
DataTable IsSendDT = MisDataFun.IOT_ReqData_UpLoad_IsSend(OpName, OrderForm, "工");
if (IsSendDT.Rows[0]["result"].ToString() != "1")
if (!TryCheckProcessReportAllowed(OpName, EngineID, OrderForm, "工"))
{
SaveMesLog("工序完工", IsSendDT.Rows[0]["msg"].ToString(), MesLogType.ERROR);
return;
}
//查询工单ID、任务ID、工序ID
var param = new SqlParameter[] {
new SqlParameter("@订单号",OrderForm),
new SqlParameter("@工序号",OpName),
new SqlParameter("@工件编号",EngineID)
};
new SqlParameter("@订单号",OrderForm),
new SqlParameter("@工序号",OpName),
new SqlParameter("@工件编号",EngineID)
};
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure("CallWebApi_FactoryMes_JobStart", ref param, out DataTable dt, out string errorMessage);
if (dt.Rows.Count > 0)
@@ -101,19 +110,17 @@ namespace WebApi
/// <param name="OrderForm"></param>
public static void CALL_Inerface_JobFinished(string OpName, string EngineID, string OrderForm)
{
DataTable IsSendDT = MisDataFun.IOT_ReqData_UpLoad_IsSend(OpName, OrderForm, "完工");
if (IsSendDT.Rows[0]["result"].ToString() != "1")
if (!TryCheckProcessReportAllowed(OpName, EngineID, OrderForm, "完工"))
{
SaveMesLog("工序完工", IsSendDT.Rows[0]["msg"].ToString(), MesLogType.ERROR);
return;
}
//查询工单ID、任务ID、工序ID
var param = new SqlParameter[] {
new SqlParameter("@订单号",OrderForm),
new SqlParameter("@工序号",OpName),
new SqlParameter("@工件编号",EngineID)
};
new SqlParameter("@订单号",OrderForm),
new SqlParameter("@工序号",OpName),
new SqlParameter("@工件编号",EngineID)
};
//DataAccess.ExecuteStoredProcedure("CallWebApi_FactoryMes_JobFinished", ref param, out DataSet ds);
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure("CallWebApi_FactoryMes_JobFinished", ref param, out DataSet ds, out string errorMessage);
//a.[订单ID],[任务ID],[工序ID],[工序名称],1 as 完工数量,@开工时间 as 开工时间,@结束时间 as 结束时间,@节拍 as 节拍,@操作时间 as 最后修改时间
@@ -283,6 +290,7 @@ namespace WebApi
orderID = dt.Rows[0]["订单ID"].ToString();
taskID = dt.Rows[0]["任务ID"].ToString();
}
// 非工厂下发的订单产品,不上传报警
if (string.IsNullOrEmpty(orderID) || string.IsNullOrEmpty(taskID)) return;
@@ -567,6 +575,15 @@ namespace WebApi
}
}
/// <summary>
/// 物料转序
/// </summary>
/// <param name="startPositionCode">起始位置编号</param>
/// <param name="endPositionCode">终点位置编号</param>
/// <param name="dataid">派工任务id</param>
/// <param name="moveTaskType">搬运类型1搬运容器2搬运货架</param>
/// <param name="vehicleStatus">载具类型0-空1-满</param>
/// <returns>返回调用结果 JObject包含 code 和 message</returns>
/// <summary>
/// 物料转序
/// </summary>
@@ -940,3 +957,4 @@ namespace WebApi
//#endregion
}
}

View File

@@ -0,0 +1,471 @@
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using MisDataSaveDate.Helper;
using static MisDataSaveDate.Helper.ApiLogHelper;
namespace MisDataSaveDate
{
/// <summary>
/// 临工AGV网页按钮业务处理。
/// </summary>
public class LGWEB_BusinessLogic
{
/// <summary>
/// 网页按钮下发临工AGV搬运任务。
/// </summary>
public static string WEB_DispatchAGV(string url, [FromBody] JObject jobj)
{
var result = new MsgResHeader<object>
{
code = 200,
message = "",
Data = null
};
if (jobj == null)
{
result.code = 500;
result.message = "参数格式不正确!";
return JsonConvert.SerializeObject(result);
}
string requestText = jobj.ToString();
SaveLog_Interface_Request(url, 2, requestText, out int aid);
try
{
LGWEB_DispatchRequest request = JsonConvert.DeserializeObject<LGWEB_DispatchRequest>(requestText);
LGWEB_DispatchResult dispatchResult = DispatchAGV(request);
result.code = dispatchResult.Success ? 200 : 500;
result.message = dispatchResult.Message;
result.Data = dispatchResult;
}
catch (Exception ex)
{
result.code = 500;
result.message = ex.Message;
SaveMesLog("LGWEB_DispatchAGV", ex.Message, MesLogType.ERROR);
}
string responseText = JsonConvert.SerializeObject(result);
SaveLog_Interface_Response(responseText, aid);
return responseText;
}
/// <summary>
/// 下发临工AGV搬运任务供 WebAPI 和 Function 直接复用。
/// </summary>
public static LGWEB_DispatchResult DispatchAGV(LGWEB_DispatchRequest request, string defaultTriggerMode = "WEB", bool requireProductPoint = false)
{
if (request == null)
{
throw new Exception("请求参数格式不正确");
}
if (IsPointToPointDispatch(request))
{
return DispatchPointToPoint(request, defaultTriggerMode);
}
if (string.IsNullOrWhiteSpace(request.routeCode))
{
throw new Exception("路线编码(routeCode)不能为空");
}
LGWEB_RouteInfo route = GetRouteInfo(request);
if (requireProductPoint && route.ProductPointMatched != "1")
{
throw new Exception($"未匹配产品点位配置routeCode={request.routeCode}, 产品型号代码={request.productModelCode}, 产品型号={request.productModel}, 动作={request.actionCode}, 过程点={request.processPointType}, 工位={request.workStation}");
}
string startPosition = string.IsNullOrWhiteSpace(request.startPosition) ? route.StartPosition : request.startPosition;
string midPosition = string.IsNullOrWhiteSpace(request.midPosition) ? route.MidPosition : request.midPosition;
string endPosition = route.ActualEndPosition;
string requestTaskId = string.IsNullOrWhiteSpace(request.requestTaskId) ? Guid.NewGuid().ToString() : request.requestTaskId;
string materialCode = FirstText(request.materialCode, request.productCode, request.containerNo);
if (string.IsNullOrWhiteSpace(startPosition))
{
throw new Exception("起点位置不能为空,请检查路线配置或请求参数");
}
if (string.IsNullOrWhiteSpace(endPosition))
{
throw new Exception("终点位置不能为空,请检查路线配置");
}
LGAGV_CallResult agvResult;
if (string.Equals(route.InterfaceName, "AddTaskFromMes2", StringComparison.OrdinalIgnoreCase))
{
agvResult = LGAGV_BusinessLogic.CallAddTask2(new LGAGV_AddTask2Request
{
requestTaskId = requestTaskId,
startPosition = startPosition,
midPosition = midPosition,
endPosition = endPosition,
materialCode = materialCode
});
}
else
{
agvResult = LGAGV_BusinessLogic.CallAddTask(new LGAGV_AddTaskRequest
{
requestTaskId = requestTaskId,
startPosition = startPosition,
endPosition = endPosition,
materialCode = materialCode
});
}
SaveDispatchResult(request, route, requestTaskId, startPosition, midPosition, endPosition, materialCode, agvResult, defaultTriggerMode);
return new LGWEB_DispatchResult
{
Success = agvResult.Success,
Message = agvResult.Success ? "AGV调度成功" : $"AGV调度失败{agvResult.Message}",
DispatchMode = "ROUTE",
RequestTaskId = requestTaskId,
RouteCode = request.routeCode,
StartPosition = startPosition,
MidPosition = midPosition,
EndPosition = endPosition,
OriginalEndPosition = route.OriginalEndPosition,
ProductPointMatched = route.ProductPointMatched,
ProcessPointType = route.ProcessPointType,
RouteMessage = route.RouteMessage,
AgvResponse = agvResult.Response
};
}
private static LGWEB_DispatchResult DispatchPointToPoint(LGWEB_DispatchRequest request, string defaultTriggerMode)
{
if (string.IsNullOrWhiteSpace(request.startPosition))
{
throw new Exception("点到点模式起点位置(startPosition)不能为空");
}
if (string.IsNullOrWhiteSpace(request.endPosition))
{
throw new Exception("点到点模式终点位置(endPosition)不能为空");
}
if (!string.IsNullOrWhiteSpace(request.midPosition))
{
throw new Exception("点到点模式不支持中间位置(midPosition)");
}
if (string.Equals(request.startPosition.Trim(), request.endPosition.Trim(), StringComparison.OrdinalIgnoreCase))
{
throw new Exception("点到点模式起点和终点不能相同");
}
if (string.IsNullOrWhiteSpace(request.productCode))
{
throw new Exception("点到点模式产品编码(productCode)不能为空");
}
request.routeCode = FirstText(request.routeCode, "MANUAL_POINT_TO_POINT");
string requestTaskId = string.IsNullOrWhiteSpace(request.requestTaskId) ? Guid.NewGuid().ToString() : request.requestTaskId;
string materialCode = FirstText(request.materialCode, request.productCode, request.containerNo);
string triggerMode = string.IsNullOrWhiteSpace(defaultTriggerMode) ? "WEB" : defaultTriggerMode;
DataRow validateRow = ValidatePointToPoint(request);
LGWEB_RouteInfo route = new LGWEB_RouteInfo
{
RouteCode = request.routeCode,
StartPosition = request.startPosition,
MidPosition = "",
OriginalEndPosition = request.endPosition,
ActualEndPosition = request.endPosition,
InterfaceName = "AddTaskFromMes",
BusinessType = "点到点搬运",
TriggerMode = triggerMode,
SourceWorkStation = ReadColumn(validateRow, "起点工位号"),
TargetWorkStation = ReadColumn(validateRow, "终点工位号"),
ProductPointMatched = "0",
ProcessPointType = "",
RouteMessage = ReadColumn(validateRow, "msg")
};
LGAGV_CallResult agvResult = LGAGV_BusinessLogic.CallAddTask(new LGAGV_AddTaskRequest
{
requestTaskId = requestTaskId,
startPosition = request.startPosition,
endPosition = request.endPosition,
materialCode = materialCode
});
SaveDispatchResult(request, route, requestTaskId, request.startPosition, "", request.endPosition, materialCode, agvResult, triggerMode);
return new LGWEB_DispatchResult
{
Success = agvResult.Success,
Message = agvResult.Success ? "AGV点到点调度成功" : $"AGV点到点调度失败{agvResult.Message}",
DispatchMode = "POINT_TO_POINT",
RequestTaskId = requestTaskId,
RouteCode = request.routeCode,
StartPosition = request.startPosition,
MidPosition = "",
EndPosition = request.endPosition,
OriginalEndPosition = request.endPosition,
ProductPointMatched = "0",
ProcessPointType = "",
RouteMessage = route.RouteMessage,
AgvResponse = agvResult.Response
};
}
/// <summary>
/// 网页按钮放行临工AGV离开。
/// </summary>
public static string WEB_AllowLeave(string url, [FromBody] JObject jobj)
{
var result = new MsgResHeader<object>
{
code = 200,
message = "",
Data = null
};
if (jobj == null)
{
result.code = 500;
result.message = "参数格式不正确!";
return JsonConvert.SerializeObject(result);
}
string requestText = jobj.ToString();
SaveLog_Interface_Request(url, 2, requestText, out int aid);
try
{
LGWEB_AllowLeaveRequest request = JsonConvert.DeserializeObject<LGWEB_AllowLeaveRequest>(requestText);
if (request == null)
{
throw new Exception("请求参数格式不正确");
}
if (string.IsNullOrWhiteSpace(request.requestId))
{
throw new Exception("请求ID(requestId)不能为空");
}
if (string.IsNullOrWhiteSpace(request.position))
{
throw new Exception("位置(position)不能为空");
}
LGAGV_CallResult agvResult = LGAGV_BusinessLogic.CallAllowLeave(new LGAGV_AllowLeaveRequest
{
requestId = request.requestId,
position = request.position,
agvNo = request.agvNo,
allowLeave = 1
});
var param = new SqlParameter[]
{
new SqlParameter("@requestId", request.requestId ?? ""),
new SqlParameter("@position", request.position ?? ""),
new SqlParameter("@agvNo", request.agvNo ?? ""),
new SqlParameter("@操作人工号", request.operatorCode ?? ""),
new SqlParameter("@操作人姓名", request.operatorName ?? ""),
new SqlParameter("@备注", request.remark ?? ""),
new SqlParameter("@是否成功", agvResult.Success ? 1 : 2),
new SqlParameter("@错误信息", agvResult.Success ? "" : (agvResult.Message ?? ""))
};
ExecuteResultProcedure("LG_AGV_库位Moby_允许离开", ref param);
result.code = agvResult.Success ? 200 : 500;
result.message = agvResult.Success ? "AGV放行成功" : $"AGV放行失败{agvResult.Message}";
result.Data = new
{
requestId = request.requestId,
position = request.position,
agvResponse = agvResult.Response
};
}
catch (Exception ex)
{
result.code = 500;
result.message = ex.Message;
SaveMesLog("LGWEB_AllowLeave", ex.Message, MesLogType.ERROR);
}
string responseText = JsonConvert.SerializeObject(result);
SaveLog_Interface_Response(responseText, aid);
return responseText;
}
private static bool IsPointToPointDispatch(LGWEB_DispatchRequest request)
{
if (string.Equals((request.dispatchMode ?? "").Trim(), "POINT_TO_POINT", StringComparison.OrdinalIgnoreCase))
{
return true;
}
return !string.IsNullOrWhiteSpace(request.startPosition) && !string.IsNullOrWhiteSpace(request.endPosition);
}
private static DataRow ValidatePointToPoint(LGWEB_DispatchRequest request)
{
var param = new SqlParameter[]
{
new SqlParameter("@起点位置", request.startPosition ?? ""),
new SqlParameter("@终点位置", request.endPosition ?? ""),
new SqlParameter("@产品编码", request.productCode ?? "")
};
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure("LG_AGV_库位Moby_点到点校验", ref param, out DataTable dt, out string errMessage);
if (!string.IsNullOrEmpty(errMessage))
{
throw new Exception(errMessage);
}
if (dt == null || dt.Rows.Count == 0)
{
throw new Exception("点到点校验无返回结果");
}
DataRow row = dt.Rows[0];
string resultText = row.Table.Columns.Contains("result") ? row["result"].ToString() : "2";
if (resultText != "1")
{
string msg = ReadColumn(row, "msg", "message");
throw new Exception(string.IsNullOrWhiteSpace(msg) ? "点到点校验失败" : msg);
}
return row;
}
private static LGWEB_RouteInfo GetRouteInfo(LGWEB_DispatchRequest request)
{
var param = new SqlParameter[]
{
new SqlParameter("@路线编码", request.routeCode ?? ""),
new SqlParameter("@产品型号代码", request.productModelCode ?? ""),
new SqlParameter("@产品型号", request.productModel ?? ""),
new SqlParameter("@动作编码", request.actionCode ?? ""),
new SqlParameter("@过程点大类", request.processPointType ?? ""),
new SqlParameter("@工位号", request.workStation ?? "")
};
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure("LG_AGV_路线_实际终点解析", ref param, out DataTable dt, out string errMessage);
if (!string.IsNullOrEmpty(errMessage))
{
throw new Exception(errMessage);
}
if (dt == null || dt.Rows.Count == 0)
{
throw new Exception("路线解析无返回结果");
}
DataRow row = dt.Rows[0];
string resultText = row.Table.Columns.Contains("result") ? row["result"].ToString() : "2";
if (resultText != "1")
{
string msg = ReadColumn(row, "msg", "message");
throw new Exception(string.IsNullOrWhiteSpace(msg) ? "路线不可用" : msg);
}
return new LGWEB_RouteInfo
{
RouteCode = ReadColumn(row, "路线编码"),
StartPosition = ReadColumn(row, "起点位置"),
MidPosition = ReadColumn(row, "中间位置"),
OriginalEndPosition = ReadColumn(row, "原终点位置", "终点位置"),
ActualEndPosition = ReadColumn(row, "实际终点位置"),
InterfaceName = FirstText(ReadColumn(row, "调用接口"), "AddTaskFromMes"),
BusinessType = ReadColumn(row, "业务类型"),
TriggerMode = ReadColumn(row, "触发方式"),
SourceWorkStation = ReadColumn(row, "源工位号"),
TargetWorkStation = ReadColumn(row, "目标工位号"),
ProductPointMatched = ReadColumn(row, "是否匹配型号点位"),
ProductModelCode = ReadColumn(row, "产品型号代码"),
ProductModel = ReadColumn(row, "产品型号"),
ActionCode = ReadColumn(row, "动作编码"),
ProcessPointType = ReadColumn(row, "过程点大类"),
RouteMessage = ReadColumn(row, "msg", "message")
};
}
private static void SaveDispatchResult(LGWEB_DispatchRequest request, LGWEB_RouteInfo route, string requestTaskId,
string startPosition, string midPosition, string endPosition, string materialCode, LGAGV_CallResult agvResult, string defaultTriggerMode)
{
var param = new SqlParameter[]
{
new SqlParameter("@路线编码", request.routeCode ?? ""),
new SqlParameter("@业务类型", route.BusinessType ?? ""),
new SqlParameter("@触发方式", string.IsNullOrWhiteSpace(route.TriggerMode) ? (defaultTriggerMode ?? "WEB") : route.TriggerMode),
new SqlParameter("@订单号", request.orderNo ?? ""),
new SqlParameter("@产品编码", FirstText(request.productCode, request.materialCode)),
new SqlParameter("@产品型号", request.productModel ?? ""),
new SqlParameter("@器具号", request.containerNo ?? ""),
new SqlParameter("@requestTaskId", requestTaskId ?? ""),
new SqlParameter("@起点位置", startPosition ?? ""),
new SqlParameter("@中间位置", midPosition ?? ""),
new SqlParameter("@终点位置", endPosition ?? ""),
new SqlParameter("@原终点位置", route.OriginalEndPosition ?? ""),
new SqlParameter("@materialCode", materialCode ?? ""),
new SqlParameter("@调用接口", route.InterfaceName ?? ""),
new SqlParameter("@操作人工号", request.operatorCode ?? ""),
new SqlParameter("@操作人姓名", request.operatorName ?? ""),
new SqlParameter("@备注", request.remark ?? ""),
new SqlParameter("@是否成功", agvResult.Success ? 1 : 2),
new SqlParameter("@错误信息", agvResult.Success ? "" : (agvResult.Message ?? ""))
};
ExecuteResultProcedure("LG_AGV_库位Moby_下发任务", ref param);
}
private static string ReadColumn(DataRow row, params string[] columnNames)
{
foreach (string columnName in columnNames)
{
if (row.Table.Columns.Contains(columnName))
{
return row[columnName]?.ToString() ?? "";
}
}
return "";
}
private static string FirstText(params string[] values)
{
foreach (string value in values)
{
if (!string.IsNullOrWhiteSpace(value))
{
return value;
}
}
return "";
}
private static void ExecuteResultProcedure(string procedureName, ref SqlParameter[] param)
{
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure(procedureName, ref param, out DataTable dt, out string errMessage);
if (!string.IsNullOrEmpty(errMessage))
{
throw new Exception(errMessage);
}
if (dt != null && dt.Rows.Count > 0 && dt.Columns.Contains("result") && dt.Rows[0]["result"].ToString() != "1")
{
string msg = dt.Columns.Contains("msg") ? dt.Rows[0]["msg"].ToString() : "存储过程执行失败";
throw new Exception(msg);
}
}
private class LGWEB_RouteInfo
{
public string RouteCode { get; set; }
public string StartPosition { get; set; }
public string MidPosition { get; set; }
public string OriginalEndPosition { get; set; }
public string ActualEndPosition { get; set; }
public string InterfaceName { get; set; }
public string BusinessType { get; set; }
public string TriggerMode { get; set; }
public string SourceWorkStation { get; set; }
public string TargetWorkStation { get; set; }
public string ProductPointMatched { get; set; }
public string ProductModelCode { get; set; }
public string ProductModel { get; set; }
public string ActionCode { get; set; }
public string ProcessPointType { get; set; }
public string RouteMessage { get; set; }
}
}
}

View File

@@ -0,0 +1,88 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace MisDataSaveDate
{
/// <summary>
/// 临工AGV网页按钮调度请求。
/// </summary>
public class LGWEB_DispatchRequest
{
public string dispatchMode { get; set; }
public string routeCode { get; set; }
public string requestTaskId { get; set; }
public string startPosition { get; set; }
public string midPosition { get; set; }
public string endPosition { get; set; }
public string materialCode { get; set; }
public string productCode { get; set; }
public string productModelCode { get; set; }
public string productModel { get; set; }
public string actionCode { get; set; }
public string processPointType { get; set; }
public string workStation { get; set; }
public string containerNo { get; set; }
public string orderNo { get; set; }
public string operatorCode { get; set; }
public string operatorName { get; set; }
public string remark { get; set; }
}
/// <summary>
/// 临工AGV网页按钮放行请求。
/// </summary>
public class LGWEB_AllowLeaveRequest
{
public string requestId { get; set; }
public string position { get; set; }
public string agvNo { get; set; }
public string operatorCode { get; set; }
public string operatorName { get; set; }
public string remark { get; set; }
}
/// <summary>
/// 临工AGV调度内部结果WebAPI 和 Function 共用。
/// </summary>
public class LGWEB_DispatchResult
{
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
[JsonProperty("dispatchMode")]
public string DispatchMode { get; set; }
[JsonProperty("requestTaskId")]
public string RequestTaskId { get; set; }
[JsonProperty("routeCode")]
public string RouteCode { get; set; }
[JsonProperty("startPosition")]
public string StartPosition { get; set; }
[JsonProperty("midPosition")]
public string MidPosition { get; set; }
[JsonProperty("endPosition")]
public string EndPosition { get; set; }
[JsonProperty("originalEndPosition")]
public string OriginalEndPosition { get; set; }
[JsonProperty("productPointMatched")]
public string ProductPointMatched { get; set; }
[JsonProperty("processPointType")]
public string ProcessPointType { get; set; }
[JsonProperty("routeMessage")]
public string RouteMessage { get; set; }
[JsonProperty("agvResponse")]
public JObject AgvResponse { get; set; }
}
}

View File

@@ -80,7 +80,7 @@ namespace MisDataSaveDate
throw new Exception("OperAtion_JobStart 缺少必要参数:工位号、订单号或工件编号");
}
CALL_Inerface_DataHandle.CALL_Inerface_JobStart(workStation1, orderNo1, workpieceNo1);
CALL_Inerface_DataHandle.CALL_Inerface_JobStart(workStation1, workpieceNo1, orderNo1);
break;
case "OperAtion_JobFinished":

View File

@@ -10,12 +10,12 @@
<!--是启用保存监控变量到数据库-->
<add key="IsRecordTagStatus" value="1" />
<!--数据库连接-->
<add key="ConnectionString_MES" value="server=.,1333;User ID=sa;Password=126.com;database=MESBasicDB_XD_ZZ;Connection Reset=FALSE" />
<add key="ConnectionString_MES" value="server=127.0.0.1,25001;User ID=meswork;Password=126.com;database=MESBasicDB_XD_GLKG;Connection Reset=FALSE" />
<!--MQTT参数配置-->
<!--<add key="MqttUrl" value="172.16.1.5:1883,WEB/InstantMessaging/XD_GLKG/MisServer" />-->
<add key="MqttUrl" value="127.0.0.1:1883,WEB/InstantMessaging/XD_ZZ/MisServer" />
<add key="TopicList" value="PLC/InstantMessaging/XD_ZZ/+,PLC|WEB/InstantMessaging/XD_ZZ/MisServer,WEB" />
<add key="MqttTargetTopic" value="MES/InstantMessaging/XD_ZZ" />
<add key="MqttUrl" value="127.0.0.1:1883,WEB/InstantMessaging/XD_GLKG/MisServer" />
<add key="TopicList" value="PLC/InstantMessaging/XD_GLKG/+,PLC|WEB/InstantMessaging/XD_GLKG/MisServer,WEB" />
<add key="MqttTargetTopic" value="MES/InstantMessaging/XD_GLKG" />
<!--电阻仪地址-->
<add key="ResistorDeviceIP_AC0901" value="192.168.10.59" />
<add key="ResistorDeviceIP_AC0906" value="192.168.10.109" />
@@ -25,7 +25,7 @@
<add key="ResistorDevicePort" value="8088" />
<!--实时监控MES在线状态-->
<add key="Webapi_MesIP" value="10.112.254.40" />
<add key="Webapi_MesIP" value="mes.xkyx.com.cn" />
<!--API端口号-->
<add key="WebSvrPort" value="9982" />
<add key="upload_Interval" value="10000" />
@@ -36,7 +36,7 @@
<add key="WebapiPostHeader_Authorization" value="Bearer c4a965c1-84e4-764e-9108-7fe66c239b54" />
<!--MES_ZHDQ_126GLKG MES_ZHDQ_126DLQ MES_ZHDQ_126ZZ-->
<add key="WebapiPostHeader_Systemcode" value="MES_ZHDQ_126ZZ" />
<add key="WebapiPostHeader_Systemcode" value="MES_ZHDQ_126GLKG" />
<!--工厂AGV部分-->
<add key="AGV_BaseUrl" value="http://10.107.68.36:8181" />

View File

@@ -268,7 +268,7 @@ namespace MisDataSaveDate
this.tableLayoutPanel1.Controls.Add(this.panel5, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.panel2, 0, 3);
this.tableLayoutPanel1.Location = new System.Drawing.Point(334, 319);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
@@ -283,9 +283,9 @@ namespace MisDataSaveDate
this.groupBox5.Controls.Add(this.textBox_WEB_TO_MES);
this.groupBox5.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox5.Location = new System.Drawing.Point(2, 172);
this.groupBox5.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox5.Margin = new System.Windows.Forms.Padding(2);
this.groupBox5.Name = "groupBox5";
this.groupBox5.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox5.Padding = new System.Windows.Forms.Padding(2);
this.groupBox5.Size = new System.Drawing.Size(386, 64);
this.groupBox5.TabIndex = 4;
this.groupBox5.TabStop = false;
@@ -295,7 +295,7 @@ namespace MisDataSaveDate
//
this.textBox_WEB_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox_WEB_TO_MES.Location = new System.Drawing.Point(2, 16);
this.textBox_WEB_TO_MES.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.textBox_WEB_TO_MES.Margin = new System.Windows.Forms.Padding(2);
this.textBox_WEB_TO_MES.Multiline = true;
this.textBox_WEB_TO_MES.Name = "textBox_WEB_TO_MES";
this.textBox_WEB_TO_MES.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
@@ -307,9 +307,9 @@ namespace MisDataSaveDate
this.groupBox1.Controls.Add(this.textBox_PLC_TO_MES);
this.groupBox1.Controls.Add(this.panel8);
this.groupBox1.Location = new System.Drawing.Point(2, 2);
this.groupBox1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox1.Margin = new System.Windows.Forms.Padding(2);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox1.Padding = new System.Windows.Forms.Padding(2);
this.groupBox1.Size = new System.Drawing.Size(386, 64);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
@@ -319,7 +319,7 @@ namespace MisDataSaveDate
//
this.textBox_PLC_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox_PLC_TO_MES.Location = new System.Drawing.Point(2, 16);
this.textBox_PLC_TO_MES.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.textBox_PLC_TO_MES.Margin = new System.Windows.Forms.Padding(2);
this.textBox_PLC_TO_MES.Multiline = true;
this.textBox_PLC_TO_MES.Name = "textBox_PLC_TO_MES";
this.textBox_PLC_TO_MES.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
@@ -532,9 +532,9 @@ namespace MisDataSaveDate
this.groupBox3.Controls.Add(this.textBox_MES_TO_WEB);
this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox3.Location = new System.Drawing.Point(2, 70);
this.groupBox3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox3.Margin = new System.Windows.Forms.Padding(2);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.groupBox3.Padding = new System.Windows.Forms.Padding(2);
this.groupBox3.Size = new System.Drawing.Size(386, 98);
this.groupBox3.TabIndex = 2;
this.groupBox3.TabStop = false;
@@ -544,7 +544,7 @@ namespace MisDataSaveDate
//
this.textBox_MES_TO_WEB.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox_MES_TO_WEB.Location = new System.Drawing.Point(2, 16);
this.textBox_MES_TO_WEB.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.textBox_MES_TO_WEB.Margin = new System.Windows.Forms.Padding(2);
this.textBox_MES_TO_WEB.Multiline = true;
this.textBox_MES_TO_WEB.Name = "textBox_MES_TO_WEB";
this.textBox_MES_TO_WEB.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
@@ -556,7 +556,7 @@ namespace MisDataSaveDate
this.panel1.Controls.Add(this.tableLayoutPanel3);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(392, 2);
this.panel1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.panel1.Margin = new System.Windows.Forms.Padding(2);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(196, 64);
this.panel1.TabIndex = 10;
@@ -574,7 +574,7 @@ namespace MisDataSaveDate
this.tableLayoutPanel3.Controls.Add(this.button_PLC_TO_MES_Small, 1, 0);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 2;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
@@ -590,7 +590,7 @@ namespace MisDataSaveDate
this.checkBox_PLC_TO_MES.AutoSize = true;
this.checkBox_PLC_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox_PLC_TO_MES.Location = new System.Drawing.Point(2, 2);
this.checkBox_PLC_TO_MES.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.checkBox_PLC_TO_MES.Margin = new System.Windows.Forms.Padding(2);
this.checkBox_PLC_TO_MES.Name = "checkBox_PLC_TO_MES";
this.checkBox_PLC_TO_MES.Size = new System.Drawing.Size(54, 22);
this.checkBox_PLC_TO_MES.TabIndex = 0;
@@ -601,7 +601,7 @@ namespace MisDataSaveDate
//
this.button_PLC_TO_MES_Clear.Dock = System.Windows.Forms.DockStyle.Fill;
this.button_PLC_TO_MES_Clear.Location = new System.Drawing.Point(138, 2);
this.button_PLC_TO_MES_Clear.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_PLC_TO_MES_Clear.Margin = new System.Windows.Forms.Padding(2);
this.button_PLC_TO_MES_Clear.Name = "button_PLC_TO_MES_Clear";
this.button_PLC_TO_MES_Clear.Size = new System.Drawing.Size(56, 22);
this.button_PLC_TO_MES_Clear.TabIndex = 1;
@@ -611,7 +611,7 @@ namespace MisDataSaveDate
// button_PLC_TO_MES_Big
//
this.button_PLC_TO_MES_Big.Location = new System.Drawing.Point(99, 2);
this.button_PLC_TO_MES_Big.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_PLC_TO_MES_Big.Margin = new System.Windows.Forms.Padding(2);
this.button_PLC_TO_MES_Big.Name = "button_PLC_TO_MES_Big";
this.button_PLC_TO_MES_Big.Size = new System.Drawing.Size(34, 20);
this.button_PLC_TO_MES_Big.TabIndex = 2;
@@ -621,7 +621,7 @@ namespace MisDataSaveDate
// button_PLC_TO_MES_Small
//
this.button_PLC_TO_MES_Small.Location = new System.Drawing.Point(60, 2);
this.button_PLC_TO_MES_Small.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_PLC_TO_MES_Small.Margin = new System.Windows.Forms.Padding(2);
this.button_PLC_TO_MES_Small.Name = "button_PLC_TO_MES_Small";
this.button_PLC_TO_MES_Small.Size = new System.Drawing.Size(34, 20);
this.button_PLC_TO_MES_Small.TabIndex = 2;
@@ -633,7 +633,7 @@ namespace MisDataSaveDate
this.panel3.Controls.Add(this.tableLayoutPanel2);
this.panel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel3.Location = new System.Drawing.Point(392, 70);
this.panel3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.panel3.Margin = new System.Windows.Forms.Padding(2);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(196, 98);
this.panel3.TabIndex = 12;
@@ -652,7 +652,7 @@ namespace MisDataSaveDate
this.tableLayoutPanel2.Controls.Add(this.button_MES_TO_WEB_Big, 2, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 2;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
@@ -673,7 +673,7 @@ namespace MisDataSaveDate
this.tableLayoutPanel2.SetColumnSpan(this.dataGridView_CheckOpName, 4);
this.dataGridView_CheckOpName.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView_CheckOpName.Location = new System.Drawing.Point(2, 28);
this.dataGridView_CheckOpName.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.dataGridView_CheckOpName.Margin = new System.Windows.Forms.Padding(2);
this.dataGridView_CheckOpName.MultiSelect = false;
this.dataGridView_CheckOpName.Name = "dataGridView_CheckOpName";
this.dataGridView_CheckOpName.RowHeadersVisible = false;
@@ -705,7 +705,7 @@ namespace MisDataSaveDate
this.checkBox__MES_TO_WEB.AutoSize = true;
this.checkBox__MES_TO_WEB.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox__MES_TO_WEB.Location = new System.Drawing.Point(2, 2);
this.checkBox__MES_TO_WEB.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.checkBox__MES_TO_WEB.Margin = new System.Windows.Forms.Padding(2);
this.checkBox__MES_TO_WEB.Name = "checkBox__MES_TO_WEB";
this.checkBox__MES_TO_WEB.Size = new System.Drawing.Size(54, 22);
this.checkBox__MES_TO_WEB.TabIndex = 0;
@@ -716,7 +716,7 @@ namespace MisDataSaveDate
//
this.button_MES_TO_WEB_Clear.Dock = System.Windows.Forms.DockStyle.Fill;
this.button_MES_TO_WEB_Clear.Location = new System.Drawing.Point(138, 2);
this.button_MES_TO_WEB_Clear.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_MES_TO_WEB_Clear.Margin = new System.Windows.Forms.Padding(2);
this.button_MES_TO_WEB_Clear.Name = "button_MES_TO_WEB_Clear";
this.button_MES_TO_WEB_Clear.Size = new System.Drawing.Size(56, 22);
this.button_MES_TO_WEB_Clear.TabIndex = 2;
@@ -726,7 +726,7 @@ namespace MisDataSaveDate
// button_MES_TO_WEB_Small
//
this.button_MES_TO_WEB_Small.Location = new System.Drawing.Point(60, 2);
this.button_MES_TO_WEB_Small.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_MES_TO_WEB_Small.Margin = new System.Windows.Forms.Padding(2);
this.button_MES_TO_WEB_Small.Name = "button_MES_TO_WEB_Small";
this.button_MES_TO_WEB_Small.Size = new System.Drawing.Size(34, 20);
this.button_MES_TO_WEB_Small.TabIndex = 4;
@@ -736,7 +736,7 @@ namespace MisDataSaveDate
// button_MES_TO_WEB_Big
//
this.button_MES_TO_WEB_Big.Location = new System.Drawing.Point(99, 2);
this.button_MES_TO_WEB_Big.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_MES_TO_WEB_Big.Margin = new System.Windows.Forms.Padding(2);
this.button_MES_TO_WEB_Big.Name = "button_MES_TO_WEB_Big";
this.button_MES_TO_WEB_Big.Size = new System.Drawing.Size(34, 20);
this.button_MES_TO_WEB_Big.TabIndex = 4;
@@ -749,7 +749,7 @@ namespace MisDataSaveDate
this.panel4.Controls.Add(this.tableLayoutPanel4);
this.panel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel4.Location = new System.Drawing.Point(392, 172);
this.panel4.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.panel4.Margin = new System.Windows.Forms.Padding(2);
this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(196, 64);
this.panel4.TabIndex = 13;
@@ -767,7 +767,7 @@ namespace MisDataSaveDate
this.tableLayoutPanel4.Controls.Add(this.button_WEB_TO_MES_Clear, 3, 0);
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel4.Name = "tableLayoutPanel4";
this.tableLayoutPanel4.RowCount = 2;
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
@@ -778,7 +778,7 @@ namespace MisDataSaveDate
// button_WEB_TO_MES_Big
//
this.button_WEB_TO_MES_Big.Location = new System.Drawing.Point(98, 2);
this.button_WEB_TO_MES_Big.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_WEB_TO_MES_Big.Margin = new System.Windows.Forms.Padding(2);
this.button_WEB_TO_MES_Big.Name = "button_WEB_TO_MES_Big";
this.button_WEB_TO_MES_Big.Size = new System.Drawing.Size(34, 20);
this.button_WEB_TO_MES_Big.TabIndex = 6;
@@ -788,7 +788,7 @@ namespace MisDataSaveDate
// button_WEB_TO_MES_Small
//
this.button_WEB_TO_MES_Small.Location = new System.Drawing.Point(60, 2);
this.button_WEB_TO_MES_Small.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_WEB_TO_MES_Small.Margin = new System.Windows.Forms.Padding(2);
this.button_WEB_TO_MES_Small.Name = "button_WEB_TO_MES_Small";
this.button_WEB_TO_MES_Small.Size = new System.Drawing.Size(34, 20);
this.button_WEB_TO_MES_Small.TabIndex = 5;
@@ -800,7 +800,7 @@ namespace MisDataSaveDate
this.checkBox_WEB_TO_MES.AutoSize = true;
this.checkBox_WEB_TO_MES.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox_WEB_TO_MES.Location = new System.Drawing.Point(2, 2);
this.checkBox_WEB_TO_MES.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.checkBox_WEB_TO_MES.Margin = new System.Windows.Forms.Padding(2);
this.checkBox_WEB_TO_MES.Name = "checkBox_WEB_TO_MES";
this.checkBox_WEB_TO_MES.Size = new System.Drawing.Size(54, 22);
this.checkBox_WEB_TO_MES.TabIndex = 0;
@@ -811,7 +811,7 @@ namespace MisDataSaveDate
//
this.button_WEB_TO_MES_Clear.Dock = System.Windows.Forms.DockStyle.Fill;
this.button_WEB_TO_MES_Clear.Location = new System.Drawing.Point(136, 2);
this.button_WEB_TO_MES_Clear.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_WEB_TO_MES_Clear.Margin = new System.Windows.Forms.Padding(2);
this.button_WEB_TO_MES_Clear.Name = "button_WEB_TO_MES_Clear";
this.button_WEB_TO_MES_Clear.Size = new System.Drawing.Size(56, 22);
this.button_WEB_TO_MES_Clear.TabIndex = 1;
@@ -895,7 +895,7 @@ namespace MisDataSaveDate
// button_SaveData
//
this.button_SaveData.Location = new System.Drawing.Point(13, 95);
this.button_SaveData.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.button_SaveData.Margin = new System.Windows.Forms.Padding(2);
this.button_SaveData.Name = "button_SaveData";
this.button_SaveData.Size = new System.Drawing.Size(56, 18);
this.button_SaveData.TabIndex = 4;
@@ -991,7 +991,7 @@ namespace MisDataSaveDate
this.tabPage1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPage1.Size = new System.Drawing.Size(171, 69);
this.tabPage1.Size = new System.Drawing.Size(170, 69);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "产品信息";
this.tabPage1.UseVisualStyleBackColor = true;
@@ -1002,7 +1002,7 @@ namespace MisDataSaveDate
this.tabPage2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPage2.Size = new System.Drawing.Size(171, 69);
this.tabPage2.Size = new System.Drawing.Size(170, 69);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "工步信息";
this.tabPage2.UseVisualStyleBackColor = true;
@@ -1012,7 +1012,7 @@ namespace MisDataSaveDate
this.tabPage3.Location = new System.Drawing.Point(4, 22);
this.tabPage3.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Size = new System.Drawing.Size(171, 69);
this.tabPage3.Size = new System.Drawing.Size(170, 69);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "物料信息";
this.tabPage3.UseVisualStyleBackColor = true;
@@ -1022,7 +1022,7 @@ namespace MisDataSaveDate
this.tabPage4.Location = new System.Drawing.Point(4, 22);
this.tabPage4.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPage4.Name = "tabPage4";
this.tabPage4.Size = new System.Drawing.Size(171, 69);
this.tabPage4.Size = new System.Drawing.Size(170, 69);
this.tabPage4.TabIndex = 3;
this.tabPage4.Text = "操作图片";
this.tabPage4.UseVisualStyleBackColor = true;
@@ -1032,7 +1032,7 @@ namespace MisDataSaveDate
this.tabPage5.Location = new System.Drawing.Point(4, 22);
this.tabPage5.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPage5.Name = "tabPage5";
this.tabPage5.Size = new System.Drawing.Size(171, 69);
this.tabPage5.Size = new System.Drawing.Size(170, 69);
this.tabPage5.TabIndex = 4;
this.tabPage5.Text = "PLC信号";
this.tabPage5.UseVisualStyleBackColor = true;
@@ -1304,6 +1304,7 @@ namespace MisDataSaveDate
this.pb_OnLine_Print.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pb_OnLine_Print.TabIndex = 1485;
this.pb_OnLine_Print.TabStop = false;
this.pb_OnLine_Print.Visible = false;
//
// label28
//
@@ -1314,6 +1315,7 @@ namespace MisDataSaveDate
this.label28.Size = new System.Drawing.Size(41, 12);
this.label28.TabIndex = 1484;
this.label28.Text = "打印机";
this.label28.Visible = false;
//
// pb_OnLine_SQL
//

View File

@@ -697,7 +697,7 @@ namespace MisDataSaveDate
{
string mesAlarmType = errDt["测量单位"].ToString();
if (AlarmExceptionTypeMap.ContainsKey(mesAlarmType)) mesAlarmType = AlarmExceptionTypeMap[mesAlarmType];
WebApi.CALL_Inerface_DataHandle.CALL_Inerface_DeviceAlarm(opName, tagID, mesAlarmType, errDt["测量项目"].ToString());
// WebApi.CALL_Inerface_DataHandle.CALL_Inerface_DeviceAlarm(opName, tagID, mesAlarmType, errDt["测量项目"].ToString());
}
}

View File

@@ -1,4 +1,4 @@
using SlMesDbIterface;
using SlMesDbIterface;
using System;
using System.Data;
using System.Linq;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -4,18 +4,18 @@
<!--配置信号表的模板表路径-->
<add key="BasicDataTableFile" value="SIGNAL_MODEL.xlsx" />
<!--变量模拟测试开关1为开启-->
<add key="IsDemoMesServer" value="1" />
<add key="IsDemoMesServer" value="0" />
<!--是启用写监控报错日志-->
<add key="IsWriteMonitorLog" value="1" />
<!--是启用保存监控变量到数据库-->
<add key="IsRecordTagStatus" value="1" />
<!--数据库连接-->
<add key="ConnectionString_MES" value="server=.,1333;User ID=sa;Password=126.com;database=MESBasicDB_XD_ZZ;Connection Reset=FALSE" />
<add key="ConnectionString_MES" value="server=127.0.0.1,25001;User ID=meswork;Password=126.com;database=MESBasicDB_XD_GLKG;Connection Reset=FALSE" />
<!--MQTT参数配置-->
<!--<add key="MqttUrl" value="172.16.1.5:1883,WEB/InstantMessaging/XD_GLKG/MisServer" />-->
<add key="MqttUrl" value="127.0.0.1:1883,WEB/InstantMessaging/XD_ZZ/MisServer" />
<add key="TopicList" value="PLC/InstantMessaging/XD_ZZ/+,PLC|WEB/InstantMessaging/XD_ZZ/MisServer,WEB" />
<add key="MqttTargetTopic" value="MES/InstantMessaging/XD_ZZ" />
<add key="MqttUrl" value="127.0.0.1:1883,WEB/InstantMessaging/XD_GLKG/MisServer" />
<add key="TopicList" value="PLC/InstantMessaging/XD_GLKG/+,PLC|WEB/InstantMessaging/XD_GLKG/MisServer,WEB" />
<add key="MqttTargetTopic" value="MES/InstantMessaging/XD_GLKG" />
<!--电阻仪地址-->
<add key="ResistorDeviceIP_AC0901" value="192.168.10.59" />
<add key="ResistorDeviceIP_AC0906" value="192.168.10.109" />
@@ -25,7 +25,7 @@
<add key="ResistorDevicePort" value="8088" />
<!--实时监控MES在线状态-->
<add key="Webapi_MesIP" value="10.112.254.40" />
<add key="Webapi_MesIP" value="mes.xkyx.com.cn" />
<!--API端口号-->
<add key="WebSvrPort" value="9982" />
<add key="upload_Interval" value="10000" />
@@ -36,7 +36,7 @@
<add key="WebapiPostHeader_Authorization" value="Bearer c4a965c1-84e4-764e-9108-7fe66c239b54" />
<!--MES_ZHDQ_126GLKG MES_ZHDQ_126DLQ MES_ZHDQ_126ZZ-->
<add key="WebapiPostHeader_Systemcode" value="MES_ZHDQ_126ZZ" />
<add key="WebapiPostHeader_Systemcode" value="MES_ZHDQ_126GLKG" />
<!--工厂AGV部分-->
<add key="AGV_BaseUrl" value="http://10.107.68.36:8181" />

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Threading;
using MisDataFunDll;
using System.Configuration;
namespace MesServerFunctions
@@ -120,6 +121,46 @@ namespace MesServerFunctions
fun_ReqTestResistor(e);
break;
}
if (ConfigurationManager.AppSettings["WebapiPostHeader_Systemcode"].ToString() == "MES_ZHDQ_126ZZ")
{
switch (e.TagTypeCodeID.ToString())
{
case "58": // 请求AGV进站上线
if (tagValue == "1") MIS_BASE.WritePLC(28, m_OpName, true);
else MIS_BASE.WritePLC(28, m_OpName, false);
break;
case "59": // 请求前往总装点(上线)
if (tagValue == "1") MIS_BASE.WritePLC(29, m_OpName, true);
else MIS_BASE.WritePLC(29, m_OpName, false);
break;
case "76": // 请求AGV离开上线
if (tagValue == "1") MIS_BASE.WritePLC(30, m_OpName, true);
else MIS_BASE.WritePLC(30, m_OpName, false);
break;
case "61": // 请求AGV退出自动
if (tagValue == "1") MIS_BASE.WritePLC(31, m_OpName, true);
else MIS_BASE.WritePLC(31, m_OpName, false);
break;
case "62": // 请求AGV进入自动
if (tagValue == "1") MIS_BASE.WritePLC(32, m_OpName, true);
else MIS_BASE.WritePLC(32, m_OpName, false);
break;
case "63": // 请求AGV托盘举升
if (tagValue == "1") MIS_BASE.WritePLC(33, m_OpName, true);
else MIS_BASE.WritePLC(33, m_OpName, false);
break;
case "64": // 请求AGV托盘下降
if (tagValue == "1") MIS_BASE.WritePLC(34, m_OpName, true);
else MIS_BASE.WritePLC(34, m_OpName, false);
break;
case "65": // 请求AGV离站自动
if (tagValue == "1") MIS_BASE.WritePLC(35, m_OpName, true);
else MIS_BASE.WritePLC(35, m_OpName, false);
break;
default:
break;
}
}
break;
}
}

View File

@@ -18,13 +18,15 @@ namespace MesServerFunctions
/// <param name="tagValue"></param>
private void EngineTypeGetOver_PLC(object e)
{
lock(lockBarcodeEngineTypeGetOver)
string opName = "";
lock (lockBarcodeEngineTypeGetOver)
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
opName = OpName;
int tagValue = Convert.ToInt32(msgEvent.TagValue);
//判断PLC机型与MES机型是否一致
if (tagValue == 1)
@@ -61,7 +63,7 @@ namespace MesServerFunctions
MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES);
// 读取MES区数据 校验MES区数据是否符合 同时判断是否此工件已工作过,若已工作过则弹出弹窗提示
if (EngineTypeID == EngineTypeID_MES & EngineID == EngineID_MES & EngineType == EngineType_MES & OrderForm == OrderForm_MES)
if (EngineTypeID == EngineTypeID_MES & EngineID == EngineID_MES & EngineType == EngineType_MES & OrderForm == OrderForm_MES)
{
if (EngineTypeID == 0 || EngineID == "" || EngineType == "" || OrderForm == "")
{
@@ -71,7 +73,7 @@ namespace MesServerFunctions
return;
}
DataTable checkTable = MisDataFun.WorkOrderCheck(OpName,EngineID_MES,OrderForm_MES,EngineType_MES);
DataTable checkTable = MisDataFun.WorkOrderCheck(OpName, EngineID_MES, OrderForm_MES, EngineType_MES);
int result = Convert.ToInt32(checkTable.Rows[0]["result"]);
string resultMsg = checkTable.Rows[0]["msg"].ToString();
if (result != 2)
@@ -123,7 +125,10 @@ namespace MesServerFunctions
}
catch (Exception err)
{
////ApplicationLog.WriteLog(err, "Function08:EngineTypeGetOver_PLC");
string logOpName = string.IsNullOrWhiteSpace(opName) ? "Function1051_EngineGetOver" : opName;
string logText = $"EngineTypeGetOver异常异常={err.Message}";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(logOpName, logText, MisDataSaveDate.Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Error("Function1051_EngineGetOver", $"{logText}{Environment.NewLine}{err}");
}
}

View File

@@ -27,12 +27,33 @@ namespace MesServerFunctions
//判断PLC机型与MES机型是否一致
if (tagValue == 1)
{
int EngineTypeID;//机型代码
int PartPallet_Code;//托盘编号
string EngineType;//机型
string EngineID;//工件编号
string OrderForm;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
int EngineTypeID = 0;//机型代码
int PartPallet_Code = 0;//托盘编号
string EngineType = "";//机型
string OrderForm = "";
MIS_BASE.Read_EngineID(OpName, out string PLCEngineID);
MIS_BASE.Read_EngineID_MES(OpName, out string MESEngineID);
string EngineID = string.IsNullOrEmpty(PLCEngineID) ? MESEngineID : PLCEngineID;
if (string.IsNullOrEmpty(EngineID))
{
string msg = $"【{OpName}】PLC与MES产品编号点位均为空继续按空产品信息保存物料扫码记录";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "MaterialsVerify " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
else
{
DataTable planDt = MisDataFun.XD_GetPlanInfoByEngineID(EngineID);
if (planDt.Rows.Count > 0)
{
OrderForm = planDt.Rows[0]["订单号"].ToString();
EngineType = planDt.Rows[0]["产品型号"].ToString();
}
else
{
string msg = $"【{OpName}】产品:{EngineID} 未在生产计划_派工订单_执行计划中查询到记录继续保存物料扫码记录";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "MaterialsVerify " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
}
int MaterialsTypeCode = Convert.ToInt32(MIS_BASE.ReadPLC(201, OpName));
string MaterialsCode = MIS_BASE.ReadPLC(40, OpName).ToString();

View File

@@ -8,7 +8,7 @@ namespace MesServerFunctions
{
partial class FunctionMES
{
object lockMesRead = new object ();
object lockMesRead = new object();
/// <summary>
/// 保存完成(针对半自动和手动压装工位)
/// </summary>
@@ -16,6 +16,9 @@ namespace MesServerFunctions
/// <param name="tagValue"></param>
private void MesRead(object e)
{
string opName = "";
string engineID = "";
string orderForm = "";
try
{
int EngineTypeID;
@@ -32,12 +35,15 @@ namespace MesServerFunctions
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
opName = OpName;
int tagValue = Convert.ToInt32(msgEvent.TagValue);
if (tagValue == 1)
{
int qualityMask;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID,out PartPallet_Code, out OrderForm);
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
engineID = EngineID;
orderForm = OrderForm;
//保存数据到线首表 先保存到 北汽福田变速器序列号总线上线 用于之前判断是否重号
// 保存质量数据
@@ -49,7 +55,10 @@ namespace MesServerFunctions
// 保存过站信息
MisDataFun.WorkStartInsert(OpName, qualityMask);
// 存追溯表数据 同时质量数据存入 接口表
//保存质量数据 接口表
MisDataFun.SaveQualityInterfaceData(OpName, EngineID);
// 调用工位完工
MisDataFun.WorkOrderOpWorkOver(OpName, EngineID, OrderForm);
// 推送质量数据到MES的页面
@@ -76,7 +85,10 @@ namespace MesServerFunctions
}
catch (Exception err)
{
////ApplicationLog.WriteLog(err, "Function08:MesReadOver");
string logOpName = string.IsNullOrWhiteSpace(opName) ? "Function1051_MesRead" : opName;
string logText = $"MesRead异常订单号={orderForm}, 工件编号={engineID}, 异常={err.Message}";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(logOpName, logText, MisDataSaveDate.Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Error("Function1051_MesRead", $"{logText}{Environment.NewLine}{err}");
}
}

View File

@@ -14,12 +14,14 @@ namespace MesServerFunctions
/// <param name="tagValue"></param>
private void EngineTypeGetOver_PLC(object e)
{
string opName = "";
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
opName = OpName;
int tagValue = Convert.ToInt32(msgEvent.TagValue);
//判断PLC机型与MES机型是否一致
if (tagValue == 1)
@@ -61,7 +63,7 @@ namespace MesServerFunctions
string msg = "【" + OpName + "】" + resultMsg;
MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg);
SendMessage.AsyncSendMessage_Notice(OpName, msg);
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "PLC传递机型 "+ msg, MisDataSaveDate.Helper.MesLogType.ERROR);
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "PLC传递机型 " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
int parType = Convert.ToInt32(checkTable.Rows[0]["小机型"]);
EngineTypeID = Convert.ToInt32(checkTable.Rows[0]["型号代码"]);
@@ -108,7 +110,10 @@ namespace MesServerFunctions
}
catch (Exception err)
{
////ApplicationLog.WriteLog(err, "Function08:EngineTypeGetOver_PLC");
string logOpName = string.IsNullOrWhiteSpace(opName) ? "Function1052_EngineGetOver" : opName;
string logText = $"EngineTypeGetOver异常异常={err.Message}";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(logOpName, logText, MisDataSaveDate.Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Error("Function1052_EngineGetOver", $"{logText}{Environment.NewLine}{err}");
}
}

View File

@@ -27,12 +27,33 @@ namespace MesServerFunctions
//判断PLC机型与MES机型是否一致
if (tagValue == 1)
{
int EngineTypeID;//机型代码
int PartPallet_Code;//托盘编号
string EngineType;//机型
string EngineID;//工件编号
string OrderForm;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
int EngineTypeID = 0;//机型代码
int PartPallet_Code = 0;//托盘编号
string EngineType = "";//机型
string OrderForm = "";
MIS_BASE.Read_EngineID(OpName, out string PLCEngineID);
MIS_BASE.Read_EngineID_MES(OpName, out string MESEngineID);
string EngineID = string.IsNullOrEmpty(PLCEngineID) ? MESEngineID : PLCEngineID;
if (string.IsNullOrEmpty(EngineID))
{
string msg = $"【{OpName}】PLC与MES产品编号点位均为空继续按空产品信息保存物料扫码记录";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "MaterialsVerify " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
else
{
DataTable planDt = MisDataFun.XD_GetPlanInfoByEngineID(EngineID);
if (planDt.Rows.Count > 0)
{
OrderForm = planDt.Rows[0]["订单号"].ToString();
EngineType = planDt.Rows[0]["产品型号"].ToString();
}
else
{
string msg = $"【{OpName}】产品:{EngineID} 未在生产计划_派工订单_执行计划中查询到记录继续保存物料扫码记录";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "MaterialsVerify " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
}
int MaterialsTypeCode = Convert.ToInt32(MIS_BASE.ReadPLC(201, OpName));
string MaterialsCode = MIS_BASE.ReadPLC(40, OpName).ToString();

View File

@@ -16,6 +16,9 @@ namespace MesServerFunctions
/// <param name="tagValue"></param>
private void MesRead(object e)
{
string opName = "";
string engineID = "";
string orderForm = "";
{
try
{
@@ -33,6 +36,7 @@ namespace MesServerFunctions
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
opName = OpName;
int tagValue = Convert.ToInt32(msgEvent.TagValue);
if (tagValue == 1)
@@ -40,6 +44,8 @@ namespace MesServerFunctions
int qualityMask;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
engineID = EngineID;
orderForm = OrderForm;
//MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES);
//保存数据到线首表 先保存到 北汽福田变速器序列号总线上线 用于之前判断是否重号
// 保存质量数据
@@ -51,7 +57,10 @@ namespace MesServerFunctions
// 测量数据发动机在线状态
MisDataFun.WorkStartInsert(OpName, qualityMask);
// 存追溯表数据
//保存质量数据到 接口表
MisDataFun.SaveQualityInterfaceData(OpName, EngineID);
// 调用工位完工
MisDataFun.WorkOrderOpWorkOver(OpName, EngineID, OrderForm);
// 推送质量数据到MES的页面
@@ -79,7 +88,10 @@ namespace MesServerFunctions
}
catch (Exception err)
{
////ApplicationLog.WriteLog(err, "Function08:MesReadOver");
string logOpName = string.IsNullOrWhiteSpace(opName) ? "Function1052_MesRead" : opName;
string logText = $"MesRead异常订单号={orderForm}, 工件编号={engineID}, 异常={err.Message}";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(logOpName, logText, MisDataSaveDate.Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Error("Function1052_MesRead", $"{logText}{Environment.NewLine}{err}");
}
}

View File

@@ -1,7 +1,8 @@
namespace MesServerFunctions
{
partial class Function1053
partial class FunctionMES
{
//针对“MIS.BizFacade.Dll”中没有的存储过程在此类中新建
//新建原则所有的函数用private,只允许在内部使用

View File

@@ -11,6 +11,5 @@ namespace MesServerFunctions
public class Db
{
}
}

View File

@@ -1,10 +0,0 @@
""
{
"FILE_VERSION" = "9237"
"ENLISTMENT_CHOICE" = "NEVER"
"PROJECT_FILE_RELATIVE_PATH" = "relative:MesServer.Function\\Function02"
"NUMBER_OF_EXCLUDED_FILES" = "0"
"ORIGINAL_PROJECT_FILE_PATH" = ""
"NUMBER_OF_NESTED_PROJECTS" = "0"
"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
}

View File

@@ -32,6 +32,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
@@ -48,17 +49,12 @@
<Reference Include="MesWork.DeviceDriver">
<HintPath>..\..\dll_common\MesWork.DeviceDriver.dll</HintPath>
</Reference>
<Reference Include="MQTTnet">
<HintPath>..\..\..\Common\dll\MQTTnet.dll</HintPath>
</Reference>
<Reference Include="MQTTnet.Extensions.ManagedClient">
<HintPath>..\..\..\Common\dll\MQTTnet.Extensions.ManagedClient.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\dll_common\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http">
@@ -93,18 +89,21 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Db.cs" />
<Compile Include="MesServerFunction\Fun_1053.cs" />
<Compile Include="Methods\EngineGetOverBaseWork.cs" />
<Compile Include="DataAccess\DataAccess.cs" />
<Compile Include="Db.cs" />
<Compile Include="MesServerFunction\Function1053.cs" />
<Compile Include="Methods\EngineGetOverBaseWork.cs" />
<Compile Include="Methods\LGAgvDispatch.cs" />
<Compile Include="OpcServer\Barcode.cs" />
<Compile Include="OpcServer\EngineGetOver.cs" />
<Compile Include="OpcServer\HeartBeat.cs" />
<Compile Include="OpcServer\MaterialsScanOver.cs" />
<Compile Include="OpcServer\MaterialsVerify.cs" />
<Compile Include="OpcServer\MesRead.cs" />
<Compile Include="OpcServer\ReqTestResistor.cs" />
<Compile Include="OpcServer\ReqEarlyFeeding.cs" />
<Compile Include="OpcServer\PartLoad.cs" />
<Compile Include="OpcServer\MesReadOver.cs" />
<Compile Include="OpcServer\WebSubmit.cs" />
<Compile Include="OpcServer\WorkIsOk.cs" />
<Compile Include="OpcServer\WorkStart.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
@@ -113,42 +112,14 @@
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Common\00MesWorkMqtt\MesWorkMqtt\00MesWorkMqtt.csproj">
<Project>{f55da1a0-a982-4479-8c47-0d9a5aaf3e18}</Project>
<Name>00MesWorkMqtt</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Common\01DoWhatPlc\01_01DoWhatPlc.csproj">
<Project>{0d1af432-439a-4920-8692-43ae139f5530}</Project>
<Name>01_01DoWhatPlc</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Common\04DataBaseAccess\DataBaseAccess\04-DataBaseAccess.csproj">
<Project>{f434e066-4c59-47c8-aa82-6f48cc84501a}</Project>
<Name>04-DataBaseAccess</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Common\07WebBusinessFacade\BusinessFacade\07BusinessFacade.csproj">
<Project>{f0a0c525-03fd-428a-9b17-7f54aa0e4475}</Project>
<Name>07BusinessFacade</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Common\08WebFun_base\WebFun_base\08-WebFun_base.csproj">
<Project>{d98be764-adeb-488d-9714-61e308aa8201}</Project>
<Name>08-WebFun_base</Name>
</ProjectReference>
<ProjectReference Include="..\..\Common\09MesDataFunction\MesDataFunction\01-MesDataFunction.csproj">
<Project>{90e76fb4-646d-45e2-95db-0b8ab4e465d6}</Project>
<Name>09-MesDataFunction</Name>
<Name>01-MesDataFunction</Name>
</ProjectReference>
<ProjectReference Include="..\..\Interface_WebAPI\SlMesDbIterface\ExternalDataSync.csproj">
<Project>{2f33d79d-1dff-4cda-b357-fcd5221cab9a}</Project>
<Name>ExternalDataSync</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\MisDataFun\SendMessageToWebMqtt\12SendMessageToWeb.csproj">
<Project>{e4eb6420-906d-4672-947a-ca33ddcdadfc}</Project>
<Name>12SendMessageToWeb</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\MIS_FuntionSaveData\MIS_FuntionSaveData\13.3MIS_FuntionSaveData.csproj">
<Project>{55b510c1-59e9-4bfd-ae84-d76d46f6e365}</Project>
<Name>02-13.3MIS_FuntionSaveData</Name>
</ProjectReference>
<ProjectReference Include="..\..\Common\MyLog4Net\00_MyLog4Net.csproj">
<Project>{1dc48c83-1842-4de8-acaf-26e1e7f7c58f}</Project>
<Name>00_MyLog4Net</Name>

View File

@@ -1,270 +0,0 @@
using MesServerWork;
using MisDataFunDll;
using MisDataSaveDate;
using System.Collections.Generic;
using System.Threading;
using System.Xml.Linq;
namespace MesServerFunctions
{
public partial class FunctionMES
{
object lockFunWork;
//public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e)
public void FunWork(string recData)
{
lockFunWork = new object();
lock (lockFunWork)
{
List<string> dataArray = MisDataFun.GetCmdStringList(recData);
//string[] dataArray = recData.Split('|');
//if (dataArray.Count != 4)
//return;
//消息来源
string m_Source = dataArray[0].ToString();
//消息类型 Barcode
string m_Command = dataArray[1].ToString();
//工位号
string m_OpName = dataArray[2].ToString();
//消息参数
string m_Value = dataArray[3].ToString();
DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceDriver_BasicData.CustomeEvetnArgs>(m_Value);
string tagValue;
switch (m_Source)
{
case "BarCode":
e.OpName = m_OpName;
e.TagValue = m_Value;
fun_Barcode(e);
break;
case "WEB":
e.OpName = m_OpName;
e.TagValue = m_Command + "|" + m_Value;
fun_WebSubmit(e);
break;
case "PLC":
e = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceDriver_BasicData.CustomeEvetnArgs>(m_Value);
string TagID = e.TagID.ToString();
switch (e.TagValue.ToString().ToLower())
{
case "false":
tagValue = "0";
break;
case "true":
tagValue = "1";
break;
default:
tagValue = e.TagValue.ToString();
break;
}
e.TagValue = tagValue;
switch (e.TagTypeCodeID.ToString())
{
//PLC 工件到位
case "2":
fun_WorkStart(e);
break;
//PLC 允许保存质量数据
case "19":
fun_MesRead(e);
break;
//MES 保存数据完成
case "20":
fun_MesReadOver(e);
break;
//PLC 申请上线
case "43":
PartLoad(e);
break;
//PLC 传递机型
case "44":
fun_EngineTypeGetOverPLC(e);
break;
//MES 合格放行
case "51":
fun_ConfirmOkGo(e);
break;
//MES 不合格放行
case "8":
fun_FalseGo(e);
break;
//PLC 工位合格标志
case "21":
fun_IsOk(e);
break;
//MES 系统健康心跳
case "14":
fun_HeartBeatMIS(e);
break;
//空料握手plc
case "49":
fun_Handshake(e);
break;
//待上料数量plc
case "38":
UpdateWait_NUM_PLC(e);
break;
case "63":
string S_plcStatus;//DBX501.5 PLC直通1 强制放行 0 正常循环
MIS_BASE.Read_TagTypeID(63, m_OpName, out S_plcStatus);
if (S_plcStatus.ToLower() != "true" || S_plcStatus.ToLower() == "1")
{
SendMessageFun.SendInfomation("PlcStatus", "0", m_OpName);
}
else
{
SendMessageFun.SendInfomation("PlcStatus", "1", m_OpName);
}
break;
//物料扫码完成
case "65":
fun_MaterialsVerify(e);
break;
}
break;
}
}
}
//1.工件到位后PLC给MES传递机型(DBX0.4)(44)
//MES判断条码是否全部扫描完成
//PLC给出允许保存(DBX100.2)(19)MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20)
//PLC见到保存完成(DBX102.2)(20)为1后清空允许保存(DBX100.2)(19)
//MES见到允许保存(DBX100.2)(19)为0后清空保存完成(DBX102.2)(20)
//MES判断总合格标志(INT104)(21)为1后给出合格放行(DBX2.5)(51)
/// <summary>
/// 扫描条码
/// </summary>
/// <param name="OpName"></param>
/// <param name="barcode"></param>
public void fun_Barcode(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
ThreadPool.QueueUserWorkItem(Barcode, e);
}
/// <summary>
/// 传递机型
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_EngineTypeGetOverPLC(DeviceDriver_BasicData .CustomeEvetnArgs e)
{
ThreadPool.QueueUserWorkItem(EngineTypeGetOver_PLC, e);
}
/// <summary>
/// 合格放行
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_ConfirmOkGo(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
// ThreadPool.QueueUserWorkItem(ConfirmOkGo, e);
}
/// <summary>
/// 不合格放行
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_FalseGo(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
// ThreadPool.QueueUserWorkItem(FalseGO, e);
}
/// <summary>
/// 允许保存
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_MesRead(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
ThreadPool.QueueUserWorkItem(MesRead, e);
}
/// <summary>
/// 物料扫码完成
/// </summary>
public void fun_MaterialsVerify(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
ThreadPool.QueueUserWorkItem(MaterialsVerify, e);
}
/// <summary>
/// 保存完成
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_MesReadOver(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
// ThreadPool.QueueUserWorkItem(MesReadOver, e);
}
/// <summary>
/// 工件到位离开(清空所有的MES信号)
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_WorkStart(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
ThreadPool.QueueUserWorkItem(WorkStart, e);
}
/// <summary>
/// 处理WEB页面发送过来的请求m_Command + "|" + m_Value;
/// </summary>
/// <param name="OpName"></param>
/// <param name="Content"></param>
public void fun_WebSubmit(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
ThreadPool.QueueUserWorkItem(WebSubmit, e);
}
/// <summary>
/// 工位是否合格
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_IsOk(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
ThreadPool.QueueUserWorkItem(IsOk, e);
}
/// <summary>
/// 系统健康心跳监测
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_HeartBeatMIS(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
// ThreadPool.QueueUserWorkItem(HeartBeat, e);
}
/// <summary>
/// 空料握手plc
/// </summary>
public void fun_Handshake(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
//ThreadPool.QueueUserWorkItem(Handshake_Fun, e);
}
/// <summary>
/// MES实时保存质量数据
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
public void fun_MesSaveNowData(DeviceDriver_BasicData.CustomeEvetnArgs e)
{
// ThreadPool.QueueUserWorkItem(MesSaveNowData, e);
}
}
}

View File

@@ -4,83 +4,108 @@ using System.Threading;
using MesServerWork;
using MisDataFunDll;
//using SystemFramework;
using WebApi;
namespace MesServerFunctions
{
partial class FunctionMES
{
/// <summary>
/// 正常逻辑工作(传递机型)
/// 分线上总线的数量
/// </summary>
public static int SubLineLoadPartCount = 2;
/// <summary>
/// 分线上总线已经匹配的数量
/// </summary>
public static int SubLineLoadPartCountMatch = 0;
/// <summary>
/// 正常逻辑工作
/// </summary>
/// <param name="OpName"></param>
/// <param name="EngineTypeID"></param>
/// <param name="EngineType"></param>
/// <param name="EngineID"></param>
/// <param name="PartPallet_Code"></param>
private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code, string OrderForm)
private void EngineTypeGetOver_PLC_Work(string OpName, int EngineTypeID, string EngineType, string EngineID, int PartPallet_Code,string OrderForm)
{
int IsAllowWork;
int RepairPartStatusPLC = 0;
int MES_QualityMask = 1;
if (EngineTypeID <= 0 || EngineID.Length == 0 || EngineType.Length == 0)
{
string msg = "【" + OpName + "】" + "PLC传递机型为空";
MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg);
SendMessageFun.AsyncSendMessage_Notice(OpName, msg);
SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC传递机型为空");
return;
}
//电子看板_装配零件_临时表_增加_北汽
//第二步将零件信息转移到零件_临时表中
MisDataFun.MesServer_Process_EngineTypeOverBQ(OpName);
//初始化物料临时表
//第二步将零件信息转移到零件_临时表中本地BOM与订单BOM的选择显示关系
//BaseDataSystemMES.MesServer_Process_EngineTypeOver_BQ_FirstOP(OpName);
//通知web显示
//MIS_BASE.Read_PalletInfo(OpName, out MES_QualityMask);//合格标志 合格标志暂时改为即时响应式的
MIS_BASE.Read_RepairStatus_PLC(OpName, out RepairPartStatusPLC);//返修标志
//SendMessageFun.SendInfomation("QualityMask", Convert.ToString(MES_QualityMask), OpName);//显示合格标志
SendMessageFun.SendInfomation("RepairPartStatusPLC", Convert.ToString(RepairPartStatusPLC), OpName);//显示返修标志
//5 显示订单、机型信息 线首工位用
SendMessage.ShowMoby_FirstOpName(OpName);
//3显示操作指导图片 PicShow_String_FirstOpName
SendMessage.PicShow_FirstOpName(OpName);
//1直接在界面通过选择机型确认工序内容
SendMessage.ProcessList_FirstOpName(OpName);
//界面显示物料信息
SendMessage.MaterialList_FirstOpName(OpName);
//第四步,获取是否允许工作
MisDataFun.MesServer_Judge_IsCanWork(OpName, out IsAllowWork);
//暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况
// 暂时先定义为扫描完成才能进行压装工作,因为考虑到工作完成后,操作工未必会去扫描物料的情况
if (IsAllowWork == 1)
{
MIS_BASE.Write_WorkStart(OpName, true);
//通知PLC允许工作,允许工作在保存完成时清空
MIS_BASE.Write_FixAllow(OpName, true);
MIS_BASE.Write_EngineTypeGetOver_PLC(OpName, true);
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.FixAllow, "1");
//调用工厂MES开工接口
WebApi.CALL_Inerface_DataHandle.CALL_Inerface_JobStart(OpName, EngineID, OrderForm);
}
else
{
SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!");
}
SendMessageFun.SendMessage("1235", "1111", OpName);
}
/// <summary>
/// 二次工作
/// </summary>
/// <param name="OpName"></param>
private void EngineTypeGetOver_PLC_Work_two(string OpName)
{
int EngineTypeID;//机型代码
int PartPallet_Code;//托盘编号
string EngineType;//机型
string EngineID;//工件编号
string OrderForm;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, Convert.ToInt32(PartPallet_Code), OrderForm);
}
/// <summary>
/// 跳过二次工作
/// 保存MOBY信息
/// </summary>
/// <param name="OpName"></param>
private void EngineTypeGetOver_PLC_Work_Skip(string OpName)
/// <param name="engineTypeID"></param>
/// <param name="engineType"></param>
/// <param name="engineID"></param>
private void SaveMobyMessage(string OpName, int engineTypeID, string engineType, string engineID, string orderForm)
{
//MIS_BASE.Write_MesReadOver(OpName, true);
MIS_BASE.Write_MaterialVerifyOver(OpName, true);
if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null)
{
MIS_BASE.InitHashtable_MesServerCode();
}
if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID.ContainsKey(OpName))
{
MIS_BASE.hashtable_EngineGetOver_EngineTypeID[OpName] = engineTypeID;
}
if (MIS_BASE.hashtable_EngineGetOver_EngineType.ContainsKey(OpName))
{
MIS_BASE.hashtable_EngineGetOver_EngineType[OpName] = engineType;
}
if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName))
{
MIS_BASE.hashtable_EngineGetOver_EngineID[OpName] = engineID;
}
if (MIS_BASE.hashtable_EngineGetOver_OrderForm.ContainsKey(OpName))
{
MIS_BASE.hashtable_EngineGetOver_OrderForm[OpName] = orderForm;
}
}
/// <summary>
@@ -89,27 +114,178 @@ namespace MesServerFunctions
/// <param name="OpName">工位号</param>
private void IsNeedRepaire_OK(string OpName)
{
//string orderForm = "";
//int engineTypeID;
//string engineType = "";
//string engineID = "";
//string palletCode = "";
//int isRepair;
//string repairCode = "";
////从监控系统中查询出本工位信息
//MisDataFun.OpName_MIS_Moby_Select(OpName,
//out orderForm, out engineTypeID, out engineType,
//out engineID, out palletCode, out isRepair, out repairCode);
//EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode), orderForm);
int isRepair;
int engineTypeID;
string engineType = "";
string engineID = "";
string palletCode = "";
string orderForm = "";
string repairCode = "";
//从监控系统中查询出本工位信息
//BaseDataSystemMES.OpName_MIS_Moby_Select(OpName,
//out orderForm, out engineTypeID, out engineType,
//out engineID, out palletCode, out isRepair, out repairCode);
//EngineTypeGetOver_PLC_Work(OpName, engineTypeID, engineType, engineID, Convert.ToInt32(palletCode),orderForm);
}
/// <summary>
/// 正常匹配分线和总线
/// </summary>
/// <param name="opName"></param>
/// <param name="engineID">总线工件号</param>
/// <param name="engineTypeID">总线工件机型代码</param>
/// <param name="engineType">总线工件机型</param>
private void Match(string opName, string engineID, int engineTypeID, string engineType, int PartPallet_Code)
{
try
{
bool m_EngineGetOver_PLC_SubLine;
int engineTypeID_SubLine;
int partPallet_Code_SubLine;
int PalletInfo = 1;//总线托盘状态
string opName_SubLine = "";//分线工件信息
string engineID_SubLine;
string engineType_SubLine;
string AlarmStr;
if (MIS_BASE.hashtable_OpNameRepair == null)
{
MIS_BASE.InitHashtable_MesServerCode();
}
//第一步:获取分线中间交互工位号
if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName))
{
opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString();
}
if (opName_SubLine == "")
{
return;
}
//第二步:获取分线传递机型信号
MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine);
if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配
//第三步:判断合格标志
MIS_BASE.Read_PalletInfo(opName_SubLine, out PalletInfo);
if (PalletInfo == 2) return; //若不合格则返回不进行匹配
string OrderForm;
//第四步:获取分线的信息,匹配验证
MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm);
//判断分线数据是否合格
//if (!BaseDataSystemMES.QulityDataVerify(opName, engineID_SubLine, out AlarmStr) && !BaseDataSystemMES.QualityVerifyStatus_Hash_Read(opName))
//{
// SendInfomation("LineoutAlert", AlarmStr, opName);
// return;
//}
//if (engineTypeID_SubLine == engineTypeID)
//{
// BaseDataSystemMES.SubLineLoadPartCountMatch_Select(opName, out SubLineLoadPartCountMatch);
// SubLineLoadPartCountMatch = SubLineLoadPartCountMatch + 1;
// BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch);
// BaseDataSystemMES.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移
// MIS_BASE.Write_Match(opName, true);//匹配结果
// MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成
// if(SubLineLoadPartCountMatch== SubLineLoadPartCount)
// {
// MIS_BASE.Write_FixAllow(opName, true);
// SubLineLoadPartCountMatch = 0;
// BaseDataSystemMES.SubLineLoadPartCountMatch_Update(opName, SubLineLoadPartCountMatch);
// }
// SendMessageFun.SendInfomation("MatchSuccess", "1", opName);
// SendMessageFun.SendMessage(opName, 1, "Match");//匹配结果
//}
//else
//{
// MIS_BASE.Write_Match(opName, false);//匹配结果
// MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成//68:1、取消返修2、匹配成功 自己监控发送 MES|MatchingCompleted
// //发送匹配完成和匹配结果信息
// SendMessageFun.AsyncSendMessage_Notice(opName,"匹配失败,工件型号不匹配!");
// SendMessageFun.SendInfomation("MatchSuccess", "0", opName);
// SendMessageFun.SendMessage(opName, 0, "Match");//匹配结果
//}
}
catch (Exception err)
{
////ApplicationLog.WriteLog("Match:" + err.ToString());
}
}
/// <summary>
/// 更新待上料数量
/// 强制匹配分线和总线
/// </summary>
/// <param name="OpName"></param>
private void UpdateWait_NUM_PLC(object e)
/// <param name="opName"></param>
private void ForceMatch(string opName)
{
try
{
//bool m_EngineGetOver_PLC_SubLine;
//bool m_EngineGetOver_PLC;
//int engineTypeID_SubLine;
//int engineTypeID;
//int partPallet_Code_SubLine;
//int partPallet_Code;
//string opName_SubLine = "";//分线工件信息
//string engineID_SubLine;
//string engineType_SubLine;
//string engineID;
//string engineType;
//if (MIS_BASE.hashtable_OpNameRepair == null)
//{
// MIS_BASE.InitHashtable_MesServerCode();
//}
////获取分线中间交互工位号
//if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(opName))
//{
// opName_SubLine = MIS_BASE.hashtable_OpNameRepair[opName].ToString();
//}
//if (opName_SubLine == "")
//{
// return;
//}
//MIS_BASE.Read_EngineGetOver_PLC(opName_SubLine, out m_EngineGetOver_PLC_SubLine);//1:读取分线工件到位的传递机型信号。
//if (!m_EngineGetOver_PLC_SubLine) return;//必须工件同时到位才能进行匹配
//MIS_BASE.Read_EngineGetOver_PLC(opName, out m_EngineGetOver_PLC);//2:读取总线工件到位的传递机型信号。
//if (!m_EngineGetOver_PLC) return;//必须工件同时到位才能进行匹配
//string OrderForm;
//MIS_BASE.GetEngineTypeFromPLC(opName_SubLine, out engineTypeID_SubLine, out engineType_SubLine, out engineID_SubLine, out partPallet_Code_SubLine,out OrderForm);//获取分线的信息
//MIS_BASE.GetEngineTypeFromPLC(opName, out engineTypeID, out engineType, out engineID, out partPallet_Code, out OrderForm);
//Mis.MailLineAndSubLineData_Insert(engineID, engineTypeID, engineType, engineID_SubLine);//分线上总线数据转移
//MIS_BASE.Write_Match(opName, true);//匹配结果
//MIS_BASE.Write_MatchingCompleted(opName, true);//匹配完成
//SendMessageFun.SendInfomation("MatchSuccess", "1", opName);//界面显示匹配成功
//MIS_BASE.Write_FixAllow(opName, true);//允许PLC工作
////发送匹配完成和匹配结果信息
//sendmessage(opName, 1, "MatchingComplete");//匹配完成
//sendmessage(opName, 1, "Match");//匹配结果
}
catch
{
}
}
}
}

View File

@@ -1,17 +1,16 @@
using System;
using System.Data;
using System.Windows.Forms;
using System.Threading;
using System.Xml.Linq;
//using SystemFramework;
using MesServerWork;
using MisDataFunDll;
namespace MesServerFunctions
{
partial class FunctionMES
{
/// <summary>
///1.扫描配送单号用于接收物料扫描单号的时候将接收的物料信息显示在“物料拉动”Tab区域
///2.扫描料箱标签/看板卡,用于追溯物料批次信息
///3.扫描零件条码,根据零件图号进行防错
object lockBarcode = new object();
///第一步,判断条码类型,根据条码类型,执行对应的存储过程
///第二步,条码类型(将扫描的条码保存到对应的表中)
///第三步,扫描完成之后给出允许工作信号
@@ -21,55 +20,213 @@ namespace MesServerFunctions
/// <param name="barcode"></param>
public void Barcode(object e)
{
lock(lockBarcode)
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
string barcode = Convert.ToString(msgEvent.TagValue);
string AlarmStr = "";
//DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
//string OpName = Convert.ToString(msgEvent.OpName);
////+*************DbName*****************
//string DbName = Convert.ToString(msgEvent.OpName);
//string barcode = Convert.ToString(msgEvent.TagValue);
int IsAllowWork;
bool IsSuccess = false;
//int EngineTypeID;//机型代码
//string EngineType;//机型
//string EngineID;//工件编号
MisDataFun.PartMaterial_DM_Update(OpName, barcode, out IsSuccess);
if (!IsSuccess)
{
SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认!");
return;
}
else
{
SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息
}
//string OrderForm;
//int Recipe1;
//int Recipe2;
//获取是否允许工作
MisDataFun.MesServer_Judge_IsCanWork(OpName, out IsAllowWork);
//bool IsNotRepeatedNumber = false;
////1:获得申请上线信息后,扫描条码才处理业务
//bool ispartload;
////115
//int PTO;
////1180=不检测1=24V,2=12V。检测线上线工位扫描总成条码根据BOM查出
//int NgearSwitch;
////1190=不检测1=24V,2=12V。检测线上线工位扫描总成条码根据BOM查出
//int RgearSwitch;
////1200=不检测1=检测。检测线上线工位扫描总成条码根据BOM查出
//int SpeedSensor;
////121例如5S 400。检测线上线工位扫描总成条码根据BOM查出
//string PartTypeMid;
////122 0=不检测1=24V,2=12V。检测线上线工位扫描总成条码根据BOM查出
//int Tcu_V;
////判断工件是否到位
//MIS_BASE.Read_WorkStart(OpName, out ispartload);
//if (!ispartload)
//{
// SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否到位DBX500.1=1");
// return;
//}
////判断设备是否申请上线
//MIS_BASE.Read_PartLoad(OpName, out ispartload);
//if (!ispartload)
//{
// SendMessageFun.AsyncSendMessage_Notice(OpName, "请检查设备是否申请上线DBX500.3=1");
// return;
//}
//// 判读条码是变速器序列号条码号还是物料号 小机型*日月年* 流水号(给起始号 + 数量)
//// 选小机型 从北汽福田BOM中选 得先维护BOM
//// 变速器序列号 '1333 050 062*16012023*30000001'
if (IsAllowWork == 1)
{
// 保存物料信息
MisDataFun.Material_Insert(OpName, 1);
////扫描完变速器序列号条码号 true
//bool isGetOver_PLC = false;
////判断上线工位MES 是否将工件流水号、机型等信息已经写入到PLC了
// MIS_BASE.Read_EngineGetOver_PLC(OpName, out isGetOver_PLC);
SendMessageFun.SendMessage("24", "11", OpName);
////如果工件流水号、机型等信息没有写入PLC扫描的条码按工件流水号进行验证
////否则按装配物料进行验证
//if (!isGetOver_PLC)
//{
// 物料验证完成
MIS_BASE.Write_MaterialVerifyOver(OpName, true);
// if (barcode.Split('*').Length > 2)
// {
// //2: 判断是否重号, 从数据库获得机型、机型代码等信息
// string partSn = barcode;
// EngineID = barcode;
//通知PLC允许工作,允许工作在保存完成时清空
MIS_BASE.Write_FixAllow(OpName, true);
}
else
{
SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认!");
}
// MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID_MES, EngineID);
// //Db.GetEngineType( partSn, out EngineTypeID, out EngineType, out EngineID, out IsRepeatedNumber);
// //Db.GetEngineType( partSn, out EngineTypeID, out EngineType, out EngineID, out IsRepeatedNumber);
// //IsRepeatedNumber true 不重号false 重号;
// IsNotRepeatedNumber = BaseDataSystemMES.EngineTypeID_IsNotRepeatedNumber(partSn);
// if (IsNotRepeatedNumber)
// {
// BaseDataSystemMES.GetEngineTypeUpLoadOpName(partSn, OpName, out EngineTypeID, out EngineType, out OrderForm, out Recipe1, out Recipe2);
// //MIS_BASE.Write_EngineID_MES(OpName, EngineID);
// //MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID);
// //MIS_BASE.Write_EngineType_MES(OpName, EngineType);
// //MIS_BASE.Write_OrderForm_MES(OpName, OrderForm);
// BaseDataSystemMES.UpLoadPTO(EngineType, out PTO, out NgearSwitch, out RgearSwitch, out SpeedSensor, out PartTypeMid, out Tcu_V);
// //PTO
// MIS_BASE.WritePLC(115, OpName, PTO);
// //空挡开关检测
// MIS_BASE.WritePLC(95, OpName, NgearSwitch);
// //倒挡开关检测
// MIS_BASE.WritePLC(96, OpName, RgearSwitch);
// //里程表检测
// MIS_BASE.WritePLC(97, OpName, SpeedSensor);
// //大机型扩展
// MIS_BASE.WritePLC(98, OpName, PartTypeMid);
// //TCU
// MIS_BASE.WritePLC(122, OpName, Tcu_V);
// string tagStartAdr;//= "DB411.10";
// // 先查询配方号 根据工位号 去moby表查配方号
// // 根据配方号 去配方表查配方数据
// // 写入配方数据
// BaseDataSystemMES.PLCRcipeCurrent(OpName, out byte[] bytes, out tagStartAdr);
// DtWebApi.ReadWritePLC.Write_TagValueByTagTypeID("94", OpName, System.Text.Encoding.ASCII.GetString(bytes));
// ////将产品信息写入PLC
// MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID);
// MIS_BASE.Write_EngineType_MES(OpName, EngineType);
// MIS_BASE.Write_EngineID_MES(OpName, EngineID);
// MIS_BASE.Write_OrderForm_MES(OpName, OrderForm);
// //写入到数据库的[北汽福田工位状态监控MOBY]表中
// //MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineTypeID_MES, EngineTypeID.ToString());
// //MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineType_MES, EngineType);
// MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID_MES, EngineID);
// //MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.OrderForm_MES, OrderForm);
// // 工位号],[订单号],[产品型号代码],[变速器序列号],[发动机型号],[机型基本代码],[变速器总成号] ,[托盘号]
// // [产品型号代码_MES],[变速器序列号_MES],[发动机型号_MES]
// // [机床上电],[循环开始],[机床故障],[上料无件],[下料堵塞],[工件到位]
// // [传递机型],[申请上件],[允许保存],[保存完成],[合格标志],[前序合格]
// // [工号],[班次],[是否返修件],[合格放行],[不合格放行],[扫描条码]
// //MisDataFun.OpName_MIS_MOBY_Insert(OpName, "产品型号代码_MES", EngineTypeID.ToString());
// //MisDataFun.OpName_MIS_MOBY_Insert(OpName, "发动机型号_MES", EngineType);
// MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true);
// //Thread.Sleep(5000);
// //MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false);
// //等待PLC将数据写入RFID写入PLC的DB块通知MES验证RFID机型数据是否正确传递
// //通知web显示
// SendMessage.ShowMoby(OpName);
// //SendMessageFun.SendMessage("1235", "1111", OpName);
// }
// else
// {
// SendMessageFun.SendInfomation("EngineIDRepeat", "partSn", OpName);
// }
// }
// else
// {
// SendMessageFun.AsyncSendMessage_Notice(OpName, "变速器序列号格式不正确,请确认!");
// }
//}
//else//验证物料
//{
// //物料号
// {
// //读取PLC的传递机型信号
// bool tagValue;
// MIS_BASE.Read_EngineGetOver_PLC(OpName, out tagValue);
// if (tagValue)
// {
// //验证物料
// BaseDataSystemMES.PartMaterial_DM_Update(OpName, barcode, out bool IsSuccess);
// if (!IsSuccess)//
// {
// SendMessageFun.AsyncSendMessage_Notice(OpName, "条码无效,请确认");
// return;
// }
// else
// {
// SendMessageFun.SendMessageFun.SendInfomation("MaterialList", "1", OpName);//通知界面更新零件信息
// }
// //判断物料是否验证完成
// BaseDataSystemMES.MesServer_Judge_IsCanWork(OpName, out int IsAllowWork);
// if (IsSuccess)
// {
// if (IsAllowWork == 1)
// {
// //移到允许保存信号中
// //BaseDataSystemMES.Material_Insert(OpName, 1);
// ////更新订单完工数量及物料
// SendMessageFun.SendMessage("24", "11", OpName);
// //物料验证完成通知PLC允许工作,允许工作在保存完成时清空
// MIS_BASE.Write_FixAllow(OpName, true);
// }
// else
// {
// SendMessageFun.AsyncSendMessage_Notice(OpName, "请扫描物料!");
// }
// }
// else
// {
// SendMessageFun.AsyncSendMessage_Notice(OpName, "PLC未传递机型");
// }
// }
// else
// {
// SendMessage.AsyncSendMessage_Notice(OpName, "产品上线后PLC获得变速器序列号后再验证物料");
// }
// }
//}
}
catch (Exception err)
{
////ApplicationLog.WriteLog(err, "Function02:Barcode");
////ApplicationLog.WriteLog(err, "Function08:Barcode");
}
}
}

View File

@@ -1,15 +1,16 @@
using System;
using System.Data;
using System.Windows.Forms;
using System.Xml.Linq;
//using SystemFramework;
using MesServerWork;
using MisDataFunDll;
//using SystemFramework;
namespace MesServerFunctions
{
partial class FunctionMES
{
object lockBarcodeEngineTypeGetOver = new object();
/// <summary>
/// PLC传递机型处理
/// </summary>
@@ -17,56 +18,123 @@ namespace MesServerFunctions
/// <param name="tagValue"></param>
private void EngineTypeGetOver_PLC(object e)
{
string opName = "";
lock (lockBarcodeEngineTypeGetOver)
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
//int tagValue = Convert.ToInt32(msgEvent.TagValue);
if(msgEvent.TagValueUp.ToString() == "6")
opName = OpName;
int tagValue = Convert.ToInt32(msgEvent.TagValue);
//判断PLC机型与MES机型是否一致
if (tagValue == 1)
{
MIS_BASE.Write_FixAllow(OpName, false);
string Program_No = "";
MisDataFun.GetEngineType_Order(OpName, Program_No, out int EngineTypeID, out string EngineType, out string EngineID, out string OrderForm, out int isCheckOk, out int planCount, out int haveUplaodCount, out int remainingQuantity, out string msg2);
if (isCheckOk == 2)
bool MesRead = false;
int EngineTypeID;//机型代码
int PartPallet_Code;//托盘编号
string EngineType;//机型
string EngineID;//工件编号
int EngineTypeID_MES;//机型代码
string EngineType_MES;//机型
string EngineID_MES;//工件编号
string OrderForm_MES;
//上线工位清MES传递机型信号
MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false);
MIS_BASE.Read_QualityData_Read_CF(OpName, out MesRead);
//第一步判断允许保存和保存完成信号是否全部被清空若未清空则通知复位MES&PLC
if (MesRead)
{
string msg = "【" + OpName + "】" + msg2;
SendMessage.AsyncSendMessage_Notice(OpName, msg);
MyLog4Net.MyLogHelper.Error("PartLoad", msg);
//未能清空信号,请求复位
string msg = "【" + OpName + "】" + "未能清空MesRead信号请求复位";
SendMessageFun.SendInfomation("AskReset", "1", OpName);
MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg);
return;
}
string OrderForm;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
MIS_BASE.GetEngineTypeFromPLC_MES(OpName, out EngineTypeID_MES, out EngineType_MES, out EngineID_MES, out OrderForm_MES);
// 读取MES区数据 校验MES区数据是否符合 同时判断是否此工件已工作过,若已工作过则弹出弹窗提示
if (EngineTypeID == EngineTypeID_MES & EngineID == EngineID_MES & EngineType == EngineType_MES & OrderForm == OrderForm_MES)
{
if (EngineTypeID == 0 || EngineID == "" || EngineType == "" || OrderForm == "")
{
string msg = "【" + OpName + "】" + "传递机型数据为空!";
MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg);
SendMessage.AsyncSendMessage_Notice(OpName, msg);
return;
}
DataTable checkTable = MisDataFun.WorkOrderCheck(OpName, EngineID_MES, OrderForm_MES, EngineType_MES);
int result = Convert.ToInt32(checkTable.Rows[0]["result"]);
string resultMsg = checkTable.Rows[0]["msg"].ToString();
if (result != 2)
{
if (result == 3)
{
string msg = "【" + OpName + "】" + resultMsg;
MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg);
SendMessage.AsyncSendMessage_Notice(OpName, msg);
}
//写入到数据库的[北汽福田工位状态监控MOBY]表中
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineTypeID, EngineTypeID.ToString());
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineType, EngineType);
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineID, EngineID);
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.OrderForm, OrderForm);
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.PartPallet_Code, PartPallet_Code.ToString());
//MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineTypeID, EngineTypeID.ToString());
//MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineType, EngineType);
//MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID, EngineID);
//MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.OrderForm, OrderForm);
EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, PartPallet_Code, OrderForm);
SendMessageFun.SendMessage("5123", "11111", OpName);
// 将工序数据转入临时表中
//BaseDataSystemMES.ProcessDataToTemp(OpName, EngineTypeID, OrderForm, EngineID);
}
else
{
string msg = "【" + OpName + "】" + resultMsg;
MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg);
SendMessage.AsyncSendMessage_Notice(OpName, msg);
}
return;
}
else
{
MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID);
MIS_BASE.Write_EngineType_MES(OpName, EngineType);
MIS_BASE.Write_EngineID_MES(OpName, EngineID);
MIS_BASE.Write_OrderForm_MES(OpName, OrderForm);
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartIn, DateTime.Now.ToString());
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineTypeID, EngineTypeID.ToString());
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineType, EngineType);
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID, EngineID);
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.OrderForm, OrderForm);
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineTypeID_MES, EngineTypeID.ToString());
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineType_MES, EngineType);
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.EngineID_MES, EngineID);
MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.OrderForm_MES, OrderForm);
MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID);
MIS_BASE.Write_EngineType_MES(OpName, EngineType);
MIS_BASE.Write_EngineID_MES(OpName, EngineID);
MIS_BASE.Write_OrderForm_MES(OpName, OrderForm);
EngineTypeGetOver_PLC_Work(OpName, EngineTypeID, EngineType, EngineID, 0, OrderForm);
string msg = "【" + OpName + "】" + "PLC与MES信息不一致";
MyLog4Net.MyLogHelper.Error("EngineTypeGetOver", msg);
SendMessage.AsyncSendMessage_Notice(OpName, msg);
}
}
else
{
MIS_BASE.Write_FixAllow(OpName, false);
}
}
catch (Exception err)
{
// 保存出错日志 1.申请上线 2.传递机型 3.允许保存 4.扫码
MisDataSaveDate.FuntionMesRead.Alarm_SaveFileLog4Error(System.Reflection.MethodBase.GetCurrentMethod().Name, e, "Fun1053", err);
////ApplicationLog.WriteLog(err, "Function02:EngineTypeGetOver_PLC");
string logOpName = string.IsNullOrWhiteSpace(opName) ? "Function1051_EngineGetOver" : opName;
string logText = $"EngineTypeGetOver异常异常={err.Message}";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(logOpName, logText, MisDataSaveDate.Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Error("Function1051_EngineGetOver", $"{logText}{Environment.NewLine}{err}");
}
}
}
}
}

View File

@@ -1,34 +0,0 @@
using MesServerWork;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MesServerFunctions
{
partial class FunctionMES
{
/// <summary>
/// MES与PLC心跳监听
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
private void HeartBeat(object e)
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
int tagValue = Convert.ToInt32(msgEvent.TagValue);
//返写在MES心跳中
MIS_BASE.WritePLC(15, OpName, tagValue);
}
catch (Exception err)
{
////ApplicationLog.WriteLog(err, "Function02:FalseGO");
}
}
}
}

View File

@@ -27,12 +27,33 @@ namespace MesServerFunctions
//判断PLC机型与MES机型是否一致
if (tagValue == 1)
{
int EngineTypeID;//机型代码
int PartPallet_Code;//托盘编号
string EngineType;//机型
string EngineID;//工件编号
string OrderForm;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
int EngineTypeID = 0;//机型代码
int PartPallet_Code = 0;//托盘编号
string EngineType = "";//机型
string OrderForm = "";
MIS_BASE.Read_EngineID(OpName, out string PLCEngineID);
MIS_BASE.Read_EngineID_MES(OpName, out string MESEngineID);
string EngineID = string.IsNullOrEmpty(PLCEngineID) ? MESEngineID : PLCEngineID;
if (string.IsNullOrEmpty(EngineID))
{
string msg = $"【{OpName}】PLC与MES产品编号点位均为空继续按空产品信息保存物料扫码记录";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "MaterialsVerify " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
else
{
DataTable planDt = MisDataFun.XD_GetPlanInfoByEngineID(EngineID);
if (planDt.Rows.Count > 0)
{
OrderForm = planDt.Rows[0]["订单号"].ToString();
EngineType = planDt.Rows[0]["产品型号"].ToString();
}
else
{
string msg = $"【{OpName}】产品:{EngineID} 未在生产计划_派工订单_执行计划中查询到记录继续保存物料扫码记录";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "MaterialsVerify " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
}
int MaterialsTypeCode = Convert.ToInt32(MIS_BASE.ReadPLC(201, OpName));
string MaterialsCode = MIS_BASE.ReadPLC(40, OpName).ToString();

View File

@@ -1,88 +1,93 @@
using MesServerWork;
using MesWork;
using MisDataFunDll;
using System;
using System.Data;
using System;
using System.Collections.Generic;
using System.Threading;
using MesServerWork;
using MisDataFunDll;
namespace MesServerFunctions
{
partial class FunctionMES
{
object lockMesRead = new object();
/// <summary>
/// 允许保存(针对半自动和手动压装工位)
/// 保存完成(针对半自动和手动压装工位)
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
private void MesRead(object e)
{
string opName = "";
string engineID = "";
string orderForm = "";
try
{
try
int EngineTypeID;
string EngineType;
string EngineID;
int PartPallet_Code;
string OrderForm;
int EngineTypeID_MES;//机型代码
string EngineType_MES;//机型
string EngineID_MES;//工件编号
string OrderForm_MES;
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
opName = OpName;
int tagValue = Convert.ToInt32(msgEvent.TagValue);
int EngineTypeID_MES;//机型代码
string EngineType_MES;//机型
string EngineID_MES;//工件编号
string OrderForm_MES;
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "0");
Thread.Sleep(500);
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "1");
if (tagValue == 1)
{
bool isEngineGetOver;
DataRow mobyData = MisDataFun.GetMobyTableByOpName(OpName).Rows[0];
EngineTypeID_MES = Convert.ToInt32(mobyData["产品型号代码_MES"]);
EngineType_MES = mobyData["发动机型号_MES"].ToString();
EngineID_MES = mobyData["变速器序列号_MES"].ToString();
OrderForm_MES = mobyData["订单号_MES"].ToString();
isEngineGetOver = Convert.ToBoolean(mobyData["允许工作"]);
int qualityMask;
MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);
engineID = EngineID;
orderForm = OrderForm;
if (!isEngineGetOver)
{
string msg2 = "【" + OpName + "】" + "请先开始订单生产后再进行保存,当前未允许工作!";
SendMessage.AsyncSendMessage_Notice(OpName, msg2);
return;
}
// 存追溯表数据
MisDataFun.WorkOrderOpWorkOver(OpName, EngineID_MES, OrderForm_MES);
//保存数据到线首表 先保存到 北汽福田变速器序列号总线上线 用于之前判断是否重号
// 保存质量数据
qualityMask = MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString());
// 保存物料数据
MisDataFun.Material_Insert(OpName, 1);
MisDataFun.Material_Insert(OpName, qualityMask);
// 测量数据发动机在线状态
MisDataFun.WorkStartInsert(OpName, 1);
// 保存过站信息
MisDataFun.WorkStartInsert(OpName, qualityMask);
// 存追溯表数据 同时质量数据存入 接口表
MisDataFun.WorkOrderOpWorkOver(OpName, EngineID, OrderForm);
// 推送质量数据到MES的页面
SendMessageFun.SendInfomation("ShowTimelyQuality", "1&" + qualityMask.ToString(), OpName);
//对应手动工位的
//MIS_BASE.Write_ConfirmOkGo(OpName, true);
//通知设备MES的质量数据和物料数据保存完成
MIS_BASE.Write_MesReadOver(OpName, true);
//MIS_BASE.Write_MaterialVerifyOver(OpName, true);
//统计在线产量,在线节拍
SendMessage.SendActuallyCount(OpName, tagValue);
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesReadOver, "1");
Thread.Sleep(1000 * 1);
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.WorkStart, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.EngineTypeGetOverPLC, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.PartLoad, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesReadOver, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.FixAllow, "0");
string msg = "【" + OpName + "】" + "工件数据保存完成!";
SendMessage.AsyncSendMessage_Notice(OpName, msg);
//调用工厂MES接口报工
WebApi.CALL_Inerface_DataHandle.CALL_Inerface_JobFinished(OpName, EngineID, OrderForm);
}
else
{
MIS_BASE.Write_MesReadOver(OpName, false);
MIS_BASE.Write_MaterialVerifyOver(OpName, false);
}
}
catch (Exception err)
{
// 保存出错日志 1.申请上线 2.传递机型 3.允许保存 4.扫码
MisDataSaveDate.FuntionMesRead.Alarm_SaveFileLog4Error(System.Reflection.MethodBase.GetCurrentMethod().Name, e, "Fun1053", err);
////ApplicationLog.WriteLog(err, "Function08:MesReadOver");
}
}
catch (Exception err)
{
string logOpName = string.IsNullOrWhiteSpace(opName) ? "Function1051_MesRead" : opName;
string logText = $"MesRead异常订单号={orderForm}, 工件编号={engineID}, 异常={err.Message}";
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(logOpName, logText, MisDataSaveDate.Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Error("Function1051_MesRead", $"{logText}{Environment.NewLine}{err}");
}
}
}
}

View File

@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Threading;
//using SystemFramework;
using MesServerWork;
@@ -21,33 +23,46 @@ namespace MesServerFunctions
string OpName = Convert.ToString(msgEvent.OpName);
int tagValue = Convert.ToInt32(msgEvent.TagValue);
// 清空MOBY表中所有数据
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.WorkStart, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.EngineTypeGetOverPLC, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.PartLoad, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesRead, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.MesReadOver, "0");
MisDataFun.MobySendWebAndSaveData(OpName, MisDataFun.MobyTagType.FixAllow, "0");
Thread.Sleep(500);
// 按照生产排序顺序获取订单相关数据
// 获取到数据 显示 申请上线、传递机型、允许工作三个点位
// 显示对应物料信息、
if (tagValue == 1)
{
// 读取当前选择的计划中的机型写入PLC
// 获取订单的机型
MisDataFun.GetEngineType_Order(OpName, out int EngineTypeID, out string EngineType, out string EngineID, out string OrderForm, out int parType, out int isCheckOk,out string msg2);
if (isCheckOk == 2)
{
string msg = "【" + OpName + "】" + msg2;
// 判断到线体上有滞留工件 ,让去管理系统进行处理
SendMessage.AsyncSendMessage_Notice(OpName, msg);
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "PartLoad " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
return;
}
else
{
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineTypeID_MES, EngineTypeID.ToString());
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineType_MES, EngineType);
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.EngineID_MES, EngineID);
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.OrderForm_MES, OrderForm);
// 写入机型代码 (大机型) 机型 发动机号 订单号
MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID);
MIS_BASE.Write_EngineType_MES(OpName, EngineType);
MIS_BASE.Write_EngineID_MES(OpName, EngineID);
MIS_BASE.Write_OrderForm_MES(OpName, OrderForm);
MIS_BASE.WritePLC(115, OpName, parType); // 托盘类型 1 静 2 动 3 拐
// MES传递机型
MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true);
}
}
else
{
////上线工位清MES传递机型信号
//MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false);
//// 清除报警
//上线工位清MES传递机型信号
MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false);
}
}
catch (Exception err)
{
// 保存出错日志 1.申请上线 2.传递机型 3.允许保存 4.扫码
MisDataSaveDate.FuntionMesRead.Alarm_SaveFileLog4Error(System.Reflection.MethodBase.GetCurrentMethod().Name, e, "Fun1053", err);
////ApplicationLog.WriteLog(err, "Function08:MesReadOver");
}
}

View File

@@ -3,8 +3,10 @@ using MesServerWork;
using System.Threading;
using MisDataSaveDate;
using System.Collections;
using MisDataFunDll;
//using SystemFramework;
namespace MesServerFunctions
{
partial class FunctionMES
@@ -18,40 +20,40 @@ namespace MesServerFunctions
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName=Convert.ToString(msgEvent.OpName);
var msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
string Content = Convert.ToString(msgEvent.TagValue);
string opName_SubLine = "";
string engineID = "";//工件信息
string[] dataArray = Content.Split('|');
if (dataArray.Length != 2)
return;
//消息类型
string m_Command = dataArray[0].ToString();
//消息参数
string m_Value = dataArray[1].ToString();
//消息参数数量
string[] m_Value_array = m_Value.Split('&');
//消息参数长度
int m_Value_length = m_Value_array.Length;
//工件信息
string engineID = "";
string m_Command = dataArray[0].ToString();//消息类型
string m_Value = dataArray[1].ToString();//消息参数
string[] m_Value_array = m_Value.Split('&');//消息参数数量
int m_Value_length = m_Value_array.Length; //消息参数长度
if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null)
{
MIS_BASE.InitHashtable_MesServerCode();
}
if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null)
{
return;
}
if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName))
{
engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString();
}
if (MIS_BASE.hashtable_OpNameRepair == null)
{
MIS_BASE.InitHashtable_MesServerCode();
}
DeviceDriver_BasicData.CustomeEvetnArgs _e = new DeviceDriver_BasicData.CustomeEvetnArgs();
_e.OpName = OpName;
_e.TagValue = m_Value;
string msg;
bool bolVal;
//根据请求的命令处理逻辑
switch (m_Command)
@@ -60,6 +62,32 @@ namespace MesServerFunctions
if (m_Value_length > 1) return;
fun_Barcode(_e);
break;
case "ConfirmOkGo"://合格放行
//修改托盘状态
//MisDataFun.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID);
MIS_BASE.Write_ConfirmOkGo(OpName, true);
MIS_BASE.Write_FalseGO(OpName, false);
Thread.Sleep(1000);
MIS_BASE.Write_ConfirmOkGo(OpName, false);
break;
case "FalseGO"://返修放行
//修改托盘状态
//BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID);
MIS_BASE.Write_FalseGO(OpName, true);
MIS_BASE.Write_ConfirmOkGo(OpName, false);
Thread.Sleep(1000);
MIS_BASE.Write_FalseGO(OpName, false);
break;
case "NgGO"://不合格放行
//修改托盘状态
//保存不合格信息(必须保存不合格放行信息由于B5A的Moby没有不合格标志位)
//BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", "");
MIS_BASE.Write_FalseGO(OpName, true);
MIS_BASE.Write_ConfirmOkGo(OpName, false);
Thread.Sleep(1000);
MIS_BASE.Write_FalseGO(OpName, false);
break;
case "OnLineState"://在线0、离线1、屏蔽2
try
{
@@ -69,6 +97,7 @@ namespace MesServerFunctions
{
//BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString());
MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value));
if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES");
if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES");
}
@@ -76,34 +105,47 @@ namespace MesServerFunctions
catch
{
}
break;
case "NullWorkGo"://空托盘放行 0不放行 1放行
try
{
int a = Convert.ToInt32(m_Value);
//修改地址值
MIS_BASE.Write_PartPalletGoOver(OpName, a);
if (a == 1)
{
SendMessage.AsyncSendMessage_Notice(OpName, "开启空托盘放行!");
}
else
{
SendMessage.AsyncSendMessage_Notice(OpName, "关闭空托盘放行!");
}
}
catch
{
}
break;
case "Reset"://复位将MES所有的信息都复位了
SetMoby(OpName);//将MES所有信号清空
break;
case "FixAllow"://重新拧紧
MIS_BASE.Write_FixAllow(OpName, false);
MIS_BASE.Write_FixAllow(OpName, true);
break;
case "IsAutoGetEngineID"://自动手动申请编号(线首)
if (m_Value_length > 1) return;
MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value));
break;
case "PartPalletGoOver"://空托盘放行
int Is_PartPalletGoOver;
MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver);
if (Is_PartPalletGoOver == 1)
{
MIS_BASE.Write_PartPalletGoOver(OpName, 1);
}
else
{
MIS_BASE.Write_PartPalletGoOver(OpName,0);
}
MIS_BASE.Write_RepairUpline_MES(opName_SubLine, true);
//MIS_BASE.Write_PalletInfo(opName_SubLine, 4);
//MIS_BASE.Write_UpdatePalletOK(opName_SubLine, true);
MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true);
break;
case "SetMoby"://清空托盘(线首)
SetMoby(OpName);//将MES所有信号清空
//MIS_BASE.Write_PartPalletCode_PLC(OpName, 1);
break;
case "RepairUplineMES"://返修上线
MIS_BASE.Write_RepairUpline_MES(OpName, true);
@@ -116,7 +158,9 @@ namespace MesServerFunctions
break;
case "WritePartPalletCode"://写入托盘号
if (m_Value_length > 1) return;
MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value));
MIS_BASE.WritePLC(113, OpName, Convert.ToInt32(m_Value));
Thread.Sleep(500);
MIS_BASE.WritePLC(70, OpName, true);
break;
case "Normal"://启用正常拧紧工位
MIS_BASE.Write_Normal(OpName, 1);
@@ -139,57 +183,87 @@ namespace MesServerFunctions
//通知修改成功
MIS_BASE.Write_UpdatePalletOK(OpName, true);
IsNeedRepaire_OK(OpName);
}
else if (Convert.ToInt32(m_Value) == 0)
{
//通知修改成功
MIS_BASE.Write_UpdatePalletOK(OpName, true);
//直接给出工作完成
MIS_BASE.Write_MaterialVerifyOver(OpName, true);
}
else
{ }
break;
//强制匹配
case "ForceMatch":
if (Convert.ToInt32(m_Value) == 1)
{
ForceMatch(OpName);
}
break;
case "PalletGO":
if (Convert.ToInt32(m_Value) == 1)
{
//直接给出工作完成
MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true);
}
break;
case "ContinueMatch":
//BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true);
fun_EngineTypeGetOverPLC(_e);
break;
//初始化网页信号
case "IniSingalToWeb":
InitializeSingalToWeb(OpName);
break;
case "Reset_Engine"://返修上线(返修上线点)
SetMoby(OpName);//将MES所有信号清空
//fun_EngineTypeGetOverPLC(OpName, 0);
//fun_EngineTypeGetOverPLC(OpName, 1);
// 检查项 检查完成
case "checkWorkOver":
MIS_BASE.WritePLC(30, OpName,1);
msg = "MES|checkWorkOverIsShow|" + OpName + "|" + 0;
SendMessage.AsyncSendMessage(msg);
break;
case "twoWorkSkip"://重新工作工件跳过工作(重新工作工件)
//工作完成
EngineTypeGetOver_PLC_Work_Skip(OpName);
// 重新申请上线
case "againPartLoad":
// 判断是否有工件到位
MIS_BASE.Read_WorkStart(OpName, out bolVal);
if (bolVal)
{
MIS_BASE.WritePLC(35, OpName, 1);
msg = "【" + OpName + "】" + "重新申请上线完成!";
SendMessage.AsyncSendMessage_Notice(OpName, msg);
}
else
{
msg = "【" + OpName + "】" + "当前无工件到位信号,请确认是否存在工件!";
SendMessage.AsyncSendMessage_Notice(OpName, msg);
}
break;
case "twoWork"://重新工作工件重新工作(重新工作工件)
//允许工作
EngineTypeGetOver_PLC_Work_two(OpName);
break;
case "SelectOrderForm"://分线接受前端模拟传递机型
_e.TagValueUp = "6";
EngineTypeGetOver_PLC(_e);
break;
case "outLineOpNameWorkOver"://分线接受前端模拟工作完成
_e.TagValueUp = "6";
_e.TagValue = 1;
MesRead(_e);
// 跳过交互
case "skipWork":
// 判断是否有工件到位
MIS_BASE.Read_WorkStart(OpName, out bolVal);
if (bolVal)
{
MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); // 传递机型
MIS_BASE.Write_FixAllow(OpName,true); // 允许工作
MIS_BASE.WritePLC(30, OpName, 1); // 检查完成
MIS_BASE.Write_MesReadOver(OpName, true); // 保存完成
MIS_BASE.Write_MaterialVerifyOver(OpName, true); // 工作完成
msg = "【" + OpName + "】" + "跳过交互完成!";
SendMessage.AsyncSendMessage_Notice(OpName, msg);
}
else
{
msg = "【" + OpName + "】" + "当前无工件到位信号,请确认是否存在工件!";
SendMessage.AsyncSendMessage_Notice(OpName, msg);
}
break;
default: break;
}
}
catch(Exception err)
{
////ApplicationLog.WriteLog(err, "Function02:WebSubmit");
////ApplicationLog.WriteLog(err, "Function08:WebSubmit");
}
}
private void SetMoby(string OpName)
{
try
@@ -201,7 +275,6 @@ namespace MesServerFunctions
SendMessageFun.SendMessage("5123", "1111", OpName);
MIS_BASE.Write_ResetDevice(OpName, true);
System.Threading.Thread.Sleep(1000);
MIS_BASE.Write_ResetDevice(OpName, false);
@@ -211,28 +284,29 @@ namespace MesServerFunctions
}
}
/// <summary>
/// 网页重现登录,恢复关闭前的页面状态
/// </summary>
/// <param name="Opname">工位号</param>
private void InitializeSingalToWeb(string OpName)
private void InitializeSingalToWeb(string Opname)
{
InitOpPosion(OpName);
InitOpPosion(Opname);
////3显示操作指导图片 PicShow_String_FirstOpName
//SendMessage.PicShow_FirstOpName(OpOpNamename);
////1直接在界面通过选择机型确认工序内容
//SendMessage.ProcessList_FirstOpName(OpName);
//// MOBY数据
//SendMessageFun.SendMessage("5", "1", OpName);
//// 物料信息 物料信息
//SendMessage.MaterialList(OpName);
SendMessageFun.SendMessage("315", "111", OpName);
//3显示操作指导图片 PicShow_String_FirstOpName
SendMessage.PicShow_FirstOpName(Opname);
//1直接在界面通过选择机型确认工序内容
SendMessage.ProcessList_FirstOpName(Opname);
// MOBY数据
SendMessageFun.SendMessage("5", "1", Opname);
//SendMessageFun.SendMessage("5123", "1111", Opname);
// 物料信息 物料信息
SendMessage.MaterialList(Opname);
// 新增查询PLC直通状态 网页显示
//MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus);
InitAlarm(OpName);
InitAlarm(Opname);
}
//分线发送工件到位信号函数
@@ -308,7 +382,7 @@ namespace MesServerFunctions
SendMessageFun.SendInfomation("MesReadOver", Convert.ToString(Convert.ToInt32(S_ReadOver)), Opname);
}
//----------------------------------------------------
bool S_MaterialVerifyOver;//工作完成 DBX2.3
bool S_MaterialVerifyOver;//工作完成 DBX0.3
MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver);
if (S_MaterialVerifyOver == true)
{

View File

@@ -1,44 +0,0 @@
using MesServerWork;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MesServerFunctions
{
partial class FunctionMES
{
/// <summary>
/// 工位合格标志
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
private void IsOk(object e)
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
int tagValue = Convert.ToInt32(msgEvent.TagValue);
int qualityMask;
MIS_BASE.Read_QualityMask(OpName, out qualityMask);
//判断是否合格
if (qualityMask == 1)
{
qualityMask = 1;
} else {
qualityMask = 0;
}
//通知WEB修改状态
string message = "MES|QualityMask|" + OpName + "|" + qualityMask.ToString();
SendMessage.AsyncSendMessage(message);
}
catch (Exception err)
{
////ApplicationLog.WriteLog(err, "Function02:FalseGO");
}
}
}
}

View File

@@ -1,8 +1,10 @@
using MesServerWork;
using System;
using System.Threading;
using System;
using System.Collections.Generic;
using MesServerWork;
using MisDataFunDll;
//using SystemFramework;
namespace MesServerFunctions
{
partial class FunctionMES
@@ -12,38 +14,53 @@ namespace MesServerFunctions
/// </summary>
/// <param name="OpName"></param>
/// <param name="tagValue"></param>
private void WorkStart(object e)
private void WorkStart(object e)
{
try
{
DeviceDriver_BasicData.CustomeEvetnArgs msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
string OpName = Convert.ToString(msgEvent.OpName);
int tagValue = Convert.ToInt32(msgEvent.TagValue);
//if (tagValue > 0)
//{
// MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.WorkStartIn, DateTime.Now.ToString());
// MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.WorkStart, tagValue.ToString());
//}
//else
//{
// MisDataFun.OpName_MIS_MOBY_Insert(OpName,MisDataFun.MobyTagType.WorkStartOut, DateTime.Now.ToString());
// MIS_BASE.Write_MesReadOver(OpName, false);
// MIS_BASE.Write_ConfirmOkGo(OpName, false);
// MIS_BASE.Write_FixAllow(OpName, false);
// MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false);
// //工作完成
// MIS_BASE.Write_MaterialVerifyOver(OpName, false);
// MIS_BASE.Write_EngineTypeID_MES(OpName, 0);
// MIS_BASE.Write_EngineType_MES(OpName, "");
// MIS_BASE.Write_EngineID_MES(OpName, "");
// MIS_BASE.Write_OrderForm_MES(OpName, "");
//}
//线首显示订单信息
if (tagValue == 1)
{
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartIn, DateTime.Now.ToString());
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStart, tagValue.ToString());
}
else
{
MisDataFun.OpName_MIS_MOBY_Insert(OpName, MisDataFun.MobyTagType.WorkStartOut, DateTime.Now.ToString());
// 清除工位数据
MIS_BASE.Write_EngineTypeID_MES(OpName, 0);
MIS_BASE.Write_EngineType_MES(OpName, "");
MIS_BASE.Write_EngineID_MES(OpName, "");
MIS_BASE.Write_OrderForm_MES(OpName, "");
MIS_BASE.Write_MesReadOver(OpName, false);
MIS_BASE.Write_ConfirmOkGo(OpName, false);
MIS_BASE.Write_FixAllow(OpName, false);
MIS_BASE.Write_EngineTypeGetOver_MES(OpName, false);
//工作完成
MIS_BASE.Write_MaterialVerifyOver(OpName, false);
MIS_BASE.WritePLC(115, OpName, 0); // 清除小机型
// 检查项完成
MIS_BASE.Write_TagTypeID(30, OpName,0);
string message = "MES|checkWorkOverIsShow|" + OpName + "|" + 0;
SendMessage.AsyncSendMessage(message);
// 重新申请上线
MIS_BASE.WritePLC(35, OpName, 0);
}
}
catch (Exception err)
catch(Exception err)
{
////ApplicationLog.WriteLog(err, "Function02:WorkStart");
////ApplicationLog.WriteLog(err, "Function08:WorkStart");
}
}
}
}

View File

@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Function02")]
[assembly: AssemblyTitle("Function08")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("苏州宏软信息技术有限公司")]
[assembly: AssemblyProduct("Function02")]
[assembly: AssemblyProduct("Function08")]
[assembly: AssemblyCopyright("Copyright © 苏州宏软信息技术有限公司 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View File

@@ -1,5 +1,5 @@
SCC = This is a Source Code Control file
[Function02.csproj]
[Function08.csproj]
SCC_Aux_Path = "\\192.168.0.100\vss\MES4.0"
SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function02", ILHAAAAA
SCC_Project_Name = "$/MisData/MisData/MisData/MesServer.Function/Function08", KRHAAAAA

View File

@@ -102,6 +102,7 @@
<Compile Include="OpcServer\AllowAGVRaise.cs" />
<Compile Include="OpcServer\CallMaterials.cs" />
<Compile Include="Methods\EngineGetOverBaseWork.cs" />
<Compile Include="Methods\TcsAgvDispatch.cs" />
<Compile Include="OpcServer\LoadEmptyTray.cs" />
<Compile Include="OpcServer\PointToPoint.cs" />
<Compile Include="OpcServer\RequestReturnMaterial.cs" />

View File

@@ -9,13 +9,12 @@ namespace MesServerFunctions
{
public partial class FunctionMES
{
object lockFunWork;
private readonly object lockFunWork = new object();
//public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e)
public void FunWork(string recData)
{
lockFunWork = new object();
lock (lockFunWork)
{
List<string> dataArray = MisDataFun.GetCmdStringList(recData);
@@ -176,10 +175,17 @@ namespace MesServerFunctions
break;
// 请求插插头
case "452":
// 需要调用AGV插插头接口 去插
if (tagValue == "1")
fun_TcsAgvDispatch(e, "插");
else
MIS_BASE.WritePLC(400, OpName, false);
break;
// 请求拔插头
case "453":
if (tagValue == "1")
fun_TcsAgvDispatch(e, "拔");
else
MIS_BASE.WritePLC(401, OpName, false);
break;
// 开始磨合
case "454":

View File

@@ -1,4 +1,4 @@
using MesServerWork;
using MesServerWork;
using MisDataFunDll;
using System;

View File

@@ -1,4 +1,4 @@
using MesServerWork;
using MesServerWork;
using MisDataFunDll;
using System;

View File

@@ -42,6 +42,11 @@ namespace MesServerFunctions
string targetProcessCode = nextDT.Rows[0]["目标工序号"].ToString();
string targetProcess = nextDT.Rows[0]["目标工序"].ToString();
if(targetStoreCode == "" || targetProcessCode == "" || targetProcess == "")
{
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "RequestReturnMaterial " + "当前无可用转序目标库位 请确认库位空闲状态!", MisDataSaveDate.Helper.MesLogType.ERROR);
return;
}
// 1. 调用AGV转序接口
var agvResult = CALL_Inerface_DataHandle.CALL_Inerface_MaterialTransfer(OpName, targetStoreCode);
@@ -97,9 +102,7 @@ namespace MesServerFunctions
MIS_BASE.WritePLC(306, OpName, 2); // 任务状态反馈
}
SendMessage.AsyncSendMessage_Notice(OpName, msg);
MyLog4Net.MyLogHelper.Info("RequestReturnMaterial", msg);
MisDataSaveDate.Helper.ApiLogHelper.SaveMesLog(OpName, "RequestReturnMaterial " + msg, MisDataSaveDate.Helper.MesLogType.ERROR);
}
else
{