探讨基于IEC61499 的分布式 ISA Batch 控制系统

        ISA SP88 是批次过程控制的标准,对应的IEC标准是IEC 61512。该标准中一个重要的部分是配方管理(Recipe Management)。

        所谓配方,是根据批量产品的要求,材料设定加工工艺,加工流程和参数。类似于传统制造业的工艺文件。在S88 中,模型是分层的。

同样的,配方是也是·分层的。

配方的分层架构

        配方在化学工程师眼中是一些化学过程和术语,对于控制系统而言,控制工程师关心的可能是阀门,泵,加热器,液位计等传感器和执行部件。

        从过程的观点看,过程模型包含了过程抽象的化学知识,从通用配方到控制配方,模型逐步地替换(适配到批次工厂的设备。最后产生控制配方(Control recipe)描述了达到过程目标的具体操作(action)。控制视野control view(或者设备视野equipment view)是以物理控制模型描述的。它涉及传感器,执行器以及它们的抽象模型-设备控制配方和控制配方。控制配方是过程观点和控制观点的交汇点。

        S88中的所有模型都是分层的,phase(我不知道准确的翻译是什么,我翻译成阶段)是控制配方中最基本的元素。不能再分解。一个阶段描述了工厂的一个基本功能,比如dosing(加料),stirring(搅拌),heating(加热)。依次完成一组阶段,称为操作(Operation)。比如操作注入反应釜(filling of reactor) 是:

  • 加料,混合A 阶段
  • 第一步完成后加料,混合 B 阶段。
  • 在第1,2 阶段的同时搅拌和冷却。

        操作在单元(unit)过程中聚集在一起赋予工厂的unit。Unit 的过程有一组操作组成。它们构成了更加高级的功能,比如通过下列操作生产产品C:

  • filling of reactor
  • reaction
  • emptying reactor.

在S88 中,配方使用一种过程功能块PFC 来描述。上面我们描述的配方,可以用下面的PFC描述:

PFC 转换称为控制系统程序

物理设备模型通常使用P&ID 图来描述:

      从上图看,有许多的阀门,两个泵,三个tank和一个浸煮器。要将配方转换成控制配方:

在左边的控制配方中包含了下列Phase

   也有人提出,将PFC 转换成Petri Net 表示法。Petri Net(PN) 是对离散并行系统的数学表示。Petri网是1962年由卡尔·A·佩特里发明的,适合于描述异步的、并发的计算机系统模型。 

 PFC 到SIPN 的映射:

 

        上面所有的描述都只是理论上的,实际上要看配方的细分程度(我们可以称为配方的颗粒度),可以粗一点,将温度读取,阀门控制有现场PLC 完成,不能通过配方修改PLC执行流程。也可以细一点,可以通过控制配方来灵活修改。这儿需要Batch 系统与现场控制系统协商决定。

        PFC 描述的过程需要转化为物理设备的控制程序和参数。 简单的方法是根据PFC编写相应的程序。如果要采用低代码方式自动生成代码,就需要将PFC 转化为控制系统模型。基本的思路是:

  •    设立过程控制服务器(control server),其中的程序根据PFC 解释执行过程控制程序。现场传感器数据通过现场控制设备读取
  •   直接将PFC 转换成为现场控制设备的控制逻辑

        对于第一种方法而言,控制程序编写是比较复杂的,它们依然需要寻找一种通用的,低代码开发方式。

     而第二种方式而言,现场设备的程序往往是控制工程师,甚至是第三方设备供应商,或者系统集成商预先做好的。Batch 系统不允许修改地层控制逻辑。于此同时,底层控制器可能使用的是不同的厂商的PLC 产品。或者使用了多台PLC 。控制逻辑是相当复杂的。Batch 软件难以做到兼容。

          另一方面,物理设备的PLC 不是分布式系统,它们不提供制造单元之间的标准化通信方式。

IEC61499 作为中间层

      一种解决方法是在batch系统和工业现场提供一个中间层,使用基于IEC61499 功能块技术是一种好的选择。系统架构如下图所示:

           从上图可见,61499 控制器并非与现场PLC 一一对应,可能是一个生产模块设立一个61499 边缘控制器,内部运行IEC61499 运行时,Opcua server 以及配方管理所需要的信息。61499 边缘控制器通过modbus 或者其它现场协议与控制现场PLC 通信。配方转化为IEC 61499 功能块网络,它们可能是直接调用PLC 中的功能块执行,也可能只是改变PLC 程序中的参数,不影响工业控制现场操作。

        IEC61499 是一种基于事件的功能块技术,而不是61131-3 基于执行周期的执行方式。IEC61499 的功能块网络与PFC 图更加接近。可以将Phase 开发成为IEC61499 的功能块(phaseFB)。

       例如:下面是一个Open_T200_T300 的PhaseFB的定义。

  IEC61499 功能块库中还包含一些SIFB 功能块,支持访问现场PLC ,传感器中的数据。网络上有一些文献描述如何将PFC 转换成IEC61499 功能块网络的方法,不外乎两种:

直接转换成为IEC61499 功能块。

(a) 是接口,(b)是功能块的内部。

使用一种调度,选择,同步的方式。

  想必操作的过程是将PFC转换成Schedule图中的状态图,通过Select 产生事件调用功能块执行,功能,有功能块是顺序执行的,有的功能块是并行执行的。当功能块完成后通过Synchronizer功能块同步后,推进到下一步执行。   对应的IEC61499 功能块大致如此:

      我没有没有完全搞清楚如何自动产生Schedule和Synchronization 功能块状态机。  

         采用IEC61499 中间层可以弥补现场PLC 的不足,在不增加PLC 开销的前提之下,开发更多IT 系统所需要的应用。在许多场合,低端PLC 不支持新的协议和功能,比如复杂的OPCUA 信息模型。PLC 工程师不熟悉IT所需要的功能编程(例如MQTT,数据库读写等等)。能够通过61499 控制器实现各种灵活应用。这将是IEC61499 重要的应用场合。

PFC 的文本描述 

     实现PFC 到IEC61499 功能块网络的转变,需要采纳文本描述的PFC 。标准化的文本描述是BatchML 标准。基于Batch,可以开发一个BatchML->IEC61499 FBNetwork XML的转换工具。

     当然也有人提出其他一些文本格式,比如UML语言模型。

开发流程

Convert 是关键的程序之一。 

未来

                过程控制领域开放自动化有一种发展的趋势就是MTP(Module Type Package) 模块。将过程控制领域的生产单元模块化,并且使用MTP 构建通用的模型。现场设备直接支持MTP模型,流程配方能够直接将PFC 转化为MTP。在这种场合,仍然需要IEC61499 作为中间层,应为需要MTP 之间的标准化通信。

MTP将会构建一个生态,如下图所示: 

设备供应商或者第三方编写MTP 模块。工厂工程师使用MTP。

结束语 

       在我的博文评论区中发现,关心IEC61499 技术的人大多数IT工程师,而不是OT工程师。想必是IT工程师渴望使用新技术更加迫切。 他们软件希望能够跨越IT/OT的鸿沟。IEC61499 是IT/OT的粘合剂。这也许是它当前最好的切入点。

        本人对过程控制行业完全是门外汉,只是有读者对IEC61499 在Batch 系统配方编排领域的应用感兴趣,才写了本博文,参考了国外一些论文的内容。

       希望得到读者的指正,共同深化IEC61499 边缘层应用这个有趣的话题。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个基于RNN模型的分布式系统故障诊断系统的完整代码示例: ```python import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import SimpleRNN, Dense, Dropout from sklearn.preprocessing import LabelEncoder, StandardScaler from sklearn.model_selection import train_test_split # 准备数据 # 假设我们有一组分布式系统的监控数据,包括CPU利用率、内存利用率和网络流量等特征,以及对应的故障标签 data = np.random.rand(1000, 3) # 特征数据,1000个样本,每个样本3个特征 labels = np.random.choice(['normal', 'faulty'], size=1000) # 故障标签 # 标签编码 label_encoder = LabelEncoder() labels_encoded = label_encoder.fit_transform(labels) # 特征标准化 scaler = StandardScaler() data_scaled = scaler.fit_transform(data) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data_scaled, labels_encoded, test_size=0.2, random_state=42) # 构建RNN模型 model = Sequential() model.add(SimpleRNN(32, activation='relu', input_shape=(3, 1))) # RNN层,32个隐藏单元 model.add(Dropout(0.2)) # Dropout层,防止过拟合 model.add(Dense(1, activation='sigmoid')) # 全连接层,输出维度为1,使用sigmoid激活函数 # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 将输入数据转换为合适的形状 X_train_rnn = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1)) X_test_rnn = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1)) # 训练模型 model.fit(X_train_rnn, y_train, epochs=10, batch_size=32) # 在测试集上评估模型 loss, accuracy = model.evaluate(X_test_rnn, y_test) print('Test Loss:', loss) print('Test Accuracy:', accuracy) # 使用模型进行预测 sample_data = np.random.rand(1, 3) # 待诊断的样本数据 sample_data_scaled = scaler.transform(sample_data) sample_data_rnn = np.reshape(sample_data_scaled, (sample_data.shape[0], sample_data.shape[1], 1)) prediction = model.predict(sample_data_rnn) predicted_label = label_encoder.inverse_transform(np.round(prediction))[0] print('Predicted Label:', predicted_label) ``` 在这个示例中,我们使用了TensorFlow和Scikit-learn库来构建和训练RNN模型。首先,我们准备了一组分布式系统的监控数据,包括特征数据和对应的故障标签。然后,我们对标签进行编码,并对特征数据进行标准化处理。接着,我们将数据划分为训练集和测试集,并构建了一个简单的RNN模型,包括一个RNN层、一个Dropout层和一个全连接层。然后,我们编译模型,并使用训练集进行模型训练。在训练完成后,我们使用测试集对模型进行评估,并输出测试集上的损失和准确率。最后,我们使用训练好的模型对待诊断的样本数据进行预测,并输出预测结果。 需要注意的是,这只是一个简单的示例代码,实际情况下可能需要根据具体的数据和问题进行模型的调整和优化。另外,还可以根据实际需求添加其他的特征工程步骤、调整模型参数、尝试不同的RNN模型结构等来提升系统的故障诊断能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值