111
cjs
2025-06-23 5ccc957c0e4768336e3272346942e1d5e2f14624
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
using Hanhe.iWCS.Business;
using Hanhe.iWCS.DeviceDriver;
using Hanhe.iWCS.Factroy;
using Hanhe.iWCS.Interface;
using Hanhe.iWCS.Model;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Configuration;
using System.Linq;
 
namespace Hanhe.iWCS.TaizhouGEMTwoTCP
{
    public class WCSServer : AppServer<WCSSession, BinaryRequestInfo> {
        /// <summary>
        /// 兼容CommandLine  命令行方式的协议 和 纯字符串的协议 都是以$$为结束符
        /// </summary>
        public WCSServer()
            : base(new YourReceiveFilter()) {
            //: base(new CommandLineReceiveFilterFactory("$$", Encoding.UTF8, new BasicRequestInfoParser(",", "&"))) {
            //设备初始化
            HardwareAccessHelper.Instance.Initialize();
            HardwareAccessHelper.Instance.ProgramDataInit();
            HardwareAccessHelper.Instance.ArchivesInit();
            SessionInstance.Instance.Initialize();
            Console.WriteLine("amswcs service CopyRight haninfo.cc " + DateTime.Now.Year);
            StockInstance.Instance.Initialize();
 
            //添加开启线程
 
            //任务拦截
            IEnentListen agvStateListen = DataAccess.CreateEnentListen();
            agvStateListen.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 1027 });
 
            //10001-读取包装线信号-3楼包装取料
            IEnentListen CheckPackingMachine = DataAccess.CreateEnentListen();
            CheckPackingMachine.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10001 });
 
            ////10002-读取复称平台信号-复称入缓存架
            //IEnentListen FuChengInCache = DataAccess.CreateEnentListen();
            //FuChengInCache.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10002 });
 
            //10003-读取叠包机信号(三楼双层缓存架入叠盘机流程)-3楼缓存架入叠托
            IEnentListen CacheStackingMouth = DataAccess.CreateEnentListen();
            CacheStackingMouth.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10003 });
 
            //10004-读包装机信号(包装机补空托流程)-3楼包装补空
            IEnentListen PickUpBlank = DataAccess.CreateEnentListen();
            PickUpBlank.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10004 });
 
            //10005-打包线空托补料请求(3楼拆盘机补空托)-3楼拆盘补空
            IEnentListen CheckPackingLineEmpty = DataAccess.CreateEnentListen();
            CheckPackingLineEmpty.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10005 });
 
            //10006 - 三楼叠盘机请求 - 3楼叠盘下线 - 二期新增任务流程
            IEnentListen CheckLineEmtpy = DataAccess.CreateEnentListen();
            CheckLineEmtpy.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10006 });
 
            //10007-打包线下线-满托入库
            IEnentListen CheckPackingLineFull = DataAccess.CreateEnentListen();
            CheckPackingLineFull.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10007 });
 
            //电梯任务
            IEnentListen plcListen = DataAccess.CreateEnentListen();
            plcListen.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 1000 });
 
            //MODBUS通道任务中间表处理
            IEnentListen ModBusTask = DataAccess.CreateEnentListen();
            ModBusTask.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 1001 });
 
            //充电任务
            IEnentListen BatteryTime = DataAccess.CreateEnentListen();
            BatteryTime.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 2000 });
 
            //写电量任务
            IEnentListen WirteBattery = DataAccess.CreateEnentListen();
            WirteBattery.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 2001 });
 
            //任务动作线程
            IEnentListen ActionControl = DataAccess.CreateEnentListen();
            ActionControl.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10010 });
 
            //写入小车状态
            IEnentListen changeSingal = DataAccess.CreateEnentListen();
            ActionControl.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10012 });
 
            //入库任务完成发送ERP批号等信息
            IEnentListen sendErpMsg = DataAccess.CreateEnentListen();
            sendErpMsg.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10013 });
 
            //读取包装线信号-3楼包装取料
            IEnentListen CheckPackingMachineTetracobalt = DataAccess.CreateEnentListen();
            CheckPackingMachineTetracobalt.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10014 });
 
            //ERP变更功能 将物料表数据插入中间表
            IEnentListen insertMidTable = DataAccess.CreateEnentListen();
            insertMidTable.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10015 });
 
            //打包线下线-3楼打包下线--已完成
            IEnentListen CheckPackingLineFullTwo = DataAccess.CreateEnentListen();
            CheckPackingLineFullTwo.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10016 });
 
            //给电梯发送心跳指令--已完成
            IEnentListen SendHeartBeat = DataAccess.CreateEnentListen();
            SendHeartBeat.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10017 });
        }
        public class YourReceiveFilter : IReceiveFilterFactory<BinaryRequestInfo> {
            public IReceiveFilter<BinaryRequestInfo> CreateFilter(IAppServer appServer, IAppSession appSession, System.Net.IPEndPoint remoteEndPoint) {
                return new MsgPackReceiveFilter();
            }
        }
        public class MsgPackReceiveFilter : TerminatorReceiveFilter<BinaryRequestInfo> {
            public MsgPackReceiveFilter()
                : base(new byte[] { 36, 36 }) {
            }
            public override BinaryRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest) {
                return base.Filter(readBuffer, offset, length, toBeCopied, out rest);
            }
            protected override BinaryRequestInfo ProcessMatchedRequest(byte[] data, int offset, int length) {
                return new BinaryRequestInfo("", data.Skip(offset).Take(length).ToArray());
            }
        }
    }
}