erp系统可以代替员工失业吗

  • 时间:
  • 浏览:710
  • 来源:成都艾邦软件开发

很多电商企业经常会有一个疑惑,我们有ERP系统,为什么订单一多仓储就管理不过来,经常出现爆仓的情况?

这是因为ERP系统虽然有一部分仓储管理的功能,但是EPR系统更倾向于平台订单管理,偏财务性的软件,它管的是账目,是企业的进销存。在仓库管理方面还是比较薄弱,光靠ERP系统是无法实现仓库的全面管控,需要搭配更专业的WMS系统。

什么是WMS系统?WMS(Warehouse Management System)翻译成中文就是仓储管理系统,它是对上游订单管理系统或ERP系统仓储功能的扩展、延伸与优化。实际应用中,它为仓储与配送中心提供更快、更准确、更精细的管理运营,提供系统层面的支持。根据实际需要,将运输、储存、装卸搬运、包装、流通加工、配送、信息处理等功能有机结合起来实现用户要求。

ERP系统和WMS系统搭配后,电商仓库管理中能够有明显的提升的有以下几点:

1、仓储规划分区

通过WMS系统对仓库进行合理的规划分区,挂指示牌、粘贴条形码等方式做好仓库的系统化分区管理。仓库管理人员只需要按照货架、货位、条码进行上下货或者拣货,精准无误,提升效率。

2、减少对人员的依赖性

传统仓库多数比较依赖员工的经验,但是仓库经常会有人员流动的,熟练的员工离职,新员工经验不足,自然会影响到仓库的管理效率。而使用WMS系统后,货品的放置区,货架,货位,条码都登记在系统内,工作人员只需要拿着按照拣货单上的货位拣货,完全不会出现误差,和新员工和老员工关系不大,都能准确无误完成操作。

3、准确掌握库存情况

入库开单、入库移位、拣货上架、货品上架、销售拣货、发货放回、等这些信息都准确记录在系统中,管理人员可以随时查看相关数据,及时调整仓库内的产品库存。而且系统对于同一种产品支持多码管理,支持优良品、残次品区分管理,支持批次、有效期明细管理,减少因为产品过期而导致的浪费。

我是卓越云仓,希望以上的内容能给您带来一些帮助,谢谢您的关注!

本文将使用一个gitHub开源的组件技术来读写西门子plc数据使用的是基于以太网的TCP/IP实现不需要额外的组件读取操作只要放到后台线程就不会卡死线程本组件支持超级方便的高性能读写操作

商业使用请联系作者QQ:200962190 或是加QQ群1592132877(满) QQ群2: 948305931 QQ群3 767856490 或是赞助240元加入QQ群VIP838185568

本文将展示如何配置网络参数及怎样使用代码来访问PLC数据希望给有需要的人解决一些实际问题。主要对西门子PLC的MQIDB块的数据读写亲测有效。

此处使用了网线直接的方式如果PLC接进了局域网就可以进行远程读写了^_^

pip install HslCommunication

导入 HslCommunication.py 后声明下面的信息

from HslCommunication import SiemensS7Net

from HslCommunication import SiemensPLCS

随便聊聊

当我们一个上位机需要读取100台西门子PLC设备此处只是举个例子凡是都是使用Modbus tcp的都是一样的的时候你采用服务器主动去请求100台设备的机制对性能来说是个极大的考验如果开100个线程去轮询100台设备那么性能损失将是非常大的更不用说再增加设备如果搭建Modbus tcp服务器就可以完美的解决性能问题因为连接的压力将会平均分摊给每一台PLC服务器端只要新增一个时间戳就可以知道客户端有没有连接上。

我们在100台PLC里都增加发送Modbus tcp方法将数据发送到服务器的ip和端口上去服务器根据站号来区分设备。这样就可以搭建一个高性能总站。 本组件支持快速搭建一个高性能的Modbus tcp总站。

关于两种模式

本组件所提供的所有客户端类包括三菱西门子欧姆龙modbus-tcp以及SimplifyNet都是继承自双模式基类双模式包含了短连接和长连接下面就具体介绍下两个模式的区别

短连接每次读写都是一个单独的请求请求完毕也就关闭了如果服务器的端口仅仅支持单连接那么关闭后这个端口可以被其他连接复用但是在频繁的网络请求下容易发生异常会有其他的请求不成功尤其是多线程的情况下。

长连接创建一个公用的连接通道所有的读写请求都利用这个通道来完成这样的话读写性能更快速即时多线程调用也不会影响内部有同步机制。如果服务器的端口仅仅支持单连接那么这个端口就被占用了比如三菱的端口机制西门子的Modbus tcp端口机制也是这样的。以下代码默认使用长连接性能更高还支持多线程同步。

在短连接的模式下每次请求都是单独的访问所以没有重连的困扰在长连接的模式下如果本次请求失败了在下次请求的时候会自动重新连接服务器直到请求成功为止。另外尽量所有的读写都对结果的成功进行判断。

关于日志记录

不管是三菱的数据访问类还是西门子的还是Modbus tcp访问类都有一个LogNet属性用来记录日志该属性是一个接口类ILogNet凡事继承该接口的都可以用来记录日志该日志会在访问失败时尤其是因为网络的原因导致访问失败时会进行日志记录如果你为这个 LogNet属性配置了真实的日志记录器的话如果你想使用该记录日志的功能请参照如下的博客进行实例化

目前还没有这个功能还C#版本特有

关于两种协议

本组件支持的西门子通信有两种协议一种是S7协议在PLC侧几乎不需要配置参数另一个协议Fetch/Write协议相对比较麻烦一点如果S7不方便读取的话可以选择Fetch/Write相对而言S7更加方便点。

这两个协议除了实例化的类型不一致读写PLC的代码和连接机制都是一致的所以FW协议的具体代码就不粘贴了详细参照下面的Demo项目。

访问测试项目

演示项目(C#版本)

下面的三篇演示了具体如何去访问PLC的数据我们在访问完成后通常需要进行处理以下的示例项目就演示了后台从PLC读取数据后前台显示并推送给所有在线客户端的功能客户端并进行图形化显示具有一定的参考意义项目地址为

下面的图片示例中的左边程序就是服务器程序它应该和PLC直接连接并接入局域网然后把数据推送给客户端显示。注意一个复杂高级的程序就应该把处理逻辑程序和界面程序分开比如这里的服务器程序实现数据采集推送存储。让客户端程序去实现数据的整理分析显示这样即使客户端程序因为BUG奔溃服务器端仍然可以正常的工作。

S7协议下的tcp直接通讯配置简单一般PLC都支持

测试通过的PLC1200系列 本人亲测

200smart 感谢 無名①终止^^ 的测试

300系列 感谢 懂PLC不懂c# 的测试

1500系列 感谢

∮溪风-⊙_⌒ 的测试

报文的格式参考了如下的两篇文章

如果你擅长于网络通信和组件开发可以通过报文格式开发出自己的西门子通信库我所做的就是基于报文格式进行了二次封装隐藏了socket通信的细节还包含了异常处理提供了简单方便的API来读写数据。提供了整数数据的读写字符串读写来丰富各种需求从事实上来说只要可以读写字节相当于任何数据了。

准备在西门子PLC上配置好IP地址就只有一个IP地址就够了然后打开电脑的cmd指令只要能ping通西门子PLC即可。

还需要在PLC侧配置打开 GET/SET通讯允许感谢网友 OLIFE提供的图片 如果碰到读取数据时出现长度验证失败的信息请务必检查下面的勾是否打上

实例化

siemens SiemensS7Net(SiemensPLCS.S1200, 192.168.8.12)

如果你的PLC是其他系列的就修改上面的枚举值本组件支持的西门子型号都在里面。

连接服务器也可以放在窗口的Load方法中一般建议使用长连接速度更快又是线程安全的调用下面的方法就是使用了长连接如果不连接直接读取数据那就是短连接

if siemens.ConnectServer().IsSuccess False:

print(connect falied)

else:

print(success)

断开连接也就是关闭了长连接如果再去请求数据就变成了短连接

siemens.ConnectClose()

地址格式:

输入的地址格式支持如下面

M类型 M100M200 如果读取位就是M100.0或是M200.7

I类型 I0I2 如果读取位就是I0.5I1.2

Q类型 Q0Q1 如果读取的是位就是Q0.4Q0.6

C类型 C0C10

T类型 T0, T20

DB块 DB1.20 如果读取位 DB1.20.6

下面就演示一些简单的数据操作省去了对结果是否成功的验证所有的读写结果都是OperateResult类型及派生类型都有一个IsSuccess属性来判断成功与否

def printReadResult(result):

if result.IsSuccess:

print(result.Content)

else:

print(failed result.Message)

def printWriteResult(result):

if result.IsSuccess:

print(success)

else:

print(falied result.Message)

if __name__ __main__:

siemens SiemensS7Net(SiemensPLCS.S1200, 192.168.8.12)

if siemens.ConnectServer().IsSuccess False:

print(connect falied)

else:

# bool read write test

siemens.WriteBool(M80.6,True)

printReadResult(siemens.ReadBool(M80.6))

# byte read write test

siemens.WriteByte(M100, 58)

printReadResult(siemens.ReadByte(M100))

# int16 read write test

siemens.WriteInt16(M102, 12358)

printReadResult(siemens.ReadInt16(M102))

# int16 read write test

siemens.WriteInt16(M104, -12358)

printReadResult(siemens.ReadInt16(M104))

# uint16 read write test

siemens.WriteUInt16(M106, 52358)

printReadResult(siemens.ReadUInt16(M106))

# int32 read write test

siemens.WriteInt32(M108, 12345678)

printReadResult(siemens.ReadInt32(M108))

# int32 read write test

siemens.WriteInt32(M112, -12345678)

printReadResult(siemens.ReadInt32(M112))

# uint32 read write test

siemens.WriteUInt32(M116, 123456789)

printReadResult(siemens.ReadInt32(M116))

# int64 read write test

siemens.WriteInt64(M120, 12345678901234)

printReadResult(siemens.ReadInt64(M120))

# float read write test

siemens.WriteFloat(M130, 123.456)

printReadResult(siemens.ReadFloat(M130))

# double read write test

siemens.WriteDouble(M140, 123.456789)

printReadResult(siemens.ReadDouble(M140))

# string read write test

siemens.WriteString(M150, 123456)

printReadResult(siemens.ReadString(M150,6))

# int16 array read write test

siemens.WriteInt16(M160, [123,456,789,-1234])

printReadResult(siemens.ReadInt16(M160,4))

siemens.ConnectClose()

下面说明复杂的数据操作以及批量化的数据操作例如读取M100-M109

read siemens.Read(M100,10)

if read.IsSuccess:

m100 read.Content[0]

m101 read.Content[1]

m102 read.Content[2]

m103 read.Content[3]

m104 read.Content[4]

m105 read.Content[5]

m106 read.Content[6]

m107 read.Content[7]

m108 read.Content[8]

m109 read.Content[9]

else:

print(read.Message)

这样就把所有的字节数据都提取上来了如果数据比较复杂还可以根据实际情况处理。当然也支持批量的写入数据信息

read siemens.Read(M100,20)

if read.IsSuccess:

count siemens.byteTransform.TransInt32(read.Content,0)

temp siemens.byteTransform.TransSingle(read.Content,4)

name1 siemens.byteTransform.TransInt16(read.Content,8)

barcode read.Content[10:20].decode(ascii)

支持M,I,Q,DB,T,C数据的读写操作

究极数据的读取

此处提供一个核心的报文读取机制你可以自己传入自己的报文然后接收服务器的报文再自己解析操作可以根据报文格式实现任意的操作当然前提是需要报文支持。假设我要实现写入M100为0x3B那么最终的报文为

03 00 00 24 02 F0 80 32 01 00 00 00 01 00 0E 00 05 05 01 12 0A 10 02 00 01 00 00 83 00 03 20 00 04 00 08 3B

read siemens.ReadFromCoreServer(SoftBasic.HexStringToBytes(03 00 00 24 02 F0 80 32 01 00 00 00 01 00 0E 00 05 05 01 12 0A 10 02 00 01 00 00 83 00 03 20 00 04 00 08 3B))

if read.IsSuccess:

# 显示服务器返回的报文

print(read.Content)

else:

# 读取错误

print(read.Message)

更详细的信息可以参照源代码里面的测试项目。

如果使用Fetch/Write协议进行读写操作PLC端的配置不一致实例化的类不一致其他都是一样的不再赘述了就重点说明下PLC网络模块的配置

环境此处使用了STEP 7V5.5 sp4编程软件作为示例在添加以太网模块(6GK7 343-1EX30-0E0 CP343-1)到组态中时可以设置IP地址及子网掩码 此处测试使用所以不使用路由器如果您的西门子需要连接到内网中的话需要配置路由器。目前只支持M,I,Q数据的读写。 然后点击新建创建一个Ethernet(1)网络。以太网参数配置如下图

将以太网的模块添加到机架中以后现在打开网络组态 打开后点击组态上的PLC模块。会出现如下界面在箭头出进行双击操作可以弹出对话框并进行一系列操作

按照上面一套操作下来创建了一个读取的端口端口号为2000后面有用需要记住 按照上述的步骤再创建一个写入的端口只有最后一步不一致如下

配置完之后的效果图如下新建了两个端口一个用于读取数据一个用于写入数据。 注意设置完成后一定要写入到PLC才算真的完成。

如上图所示上图配置错误应该配置一个同时支持读写的操作的端口

实例化的类的时候

siemens SiemensFetchWriteNet(192.168.8.12, 2000)