[クラウド ネイティブ] クラウドへのデバイス用の FlexManager ベースのアプリケーション開発


序文

前回の記事で、FlexManager デバイスのクラウド データのさまざまな操作について紹介しました。この記事の冒頭では、デバイス クラウド データベースのデータをクライアント アプリケーション開発に使用する方法を 1 つずつ紹介します。もちろん、クラウドに入る最も基本的な機器には、自動化の基本的な知識が必要です. 学生が興味を持っている場合は、私の学習教材にアクセスして波を学ぶことができます.ここでは焦点を当てません. この記事では、FlexManager に基づく Visual Studio アプリケーションの開発に焦点を当てています。


`特記事項:
1. Visual Studio バージョン 15.3 以降に適用されます。
2. NuGet 依存パッケージ FBoxClientDriver および FBoxClientDriver.Contract を導入する必要があります。

1.Visual Studio アプリケーション開発

1. 処理手順

①構成パラメータ
②DefaultCredentialProvider オブジェクトを作成する

③FBoxClientManagerオブジェクトを作成する ④
サーバーにログインする

⑤ボックス状態変化イベント
をリッスン⑥リアルタイムデータプッシュ変化イベントをリッスン

⑦ ボックスの全監視ポイントのデータプッシュを開く

⑧メソッド定義 ⑨メソッド
呼び出し

2. サンプルコード

注: データをプッシュする前にポイントを開く必要があります

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using FBoxClientDriver;
using FBoxClientDriver.Contract;
using FBoxClientDriver.Impl;

namespace SDKDEMO
{
    
    
    //配置参数
    public class FBoxClientParameters
    {
    
    
        public static string ClientId {
    
     get; set; } = "";
        public static string ClientSecret {
    
     get; set; } = "";
        public static string UserName {
    
     get; set; } = "";
        public static string Password {
    
     get; set; } = "";
        public static string IdServer {
    
     get; set; } = "https://account.flexem.com/core";
        public static string MainServer {
    
     get; set; } = "http://fbox360.com";
        public static string HdataServer {
    
     get; set; } = "http://fbhs1.fbox360.com";
    }

    public class FBoxDemo : IDisposable
    {
    
    
        private readonly IFBoxClientManager _fbox;
        private readonly string boxNo = "300015050009"; // 以这个为例子

        public FBoxDemo()
        {
    
    
            //创建对象并初始化
            var provider =
                new DefaultCredentialProvider(FBoxClientParameters.ClientId, FBoxClientParameters.ClientSecret,
                    FBoxClientParameters.UserName, FBoxClientParameters.Password);
            _fbox = new FBoxClientManager(FBoxClientParameters.IdServer, FBoxClientParameters.MainServer,
                FBoxClientParameters.HdataServer, provider, Guid.NewGuid().ToString("N"), null);
        }

        public void Dispose()
        {
    
    
            _fbox?.Dispose();
        }

       /// <summary>
        /// 启动
        /// </summary>
        public void Start()
        {
    
    
            //初始化SDK,内部建立signalr连接对象,Restart只需全局执行一次。
            _fbox.Restart().Wait();
            //侦听盒子状态变更事件
            _fbox.BoxConnectStateChanged += _fbox_BoxConnectStateChanged;
            //侦听实时数据变更事件
            _fbox.DataMonitorValueChanged += _fbox_DataMonitorValueChanged;
        }

        /// <summary>
        /// 实时数据变更函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _fbox_DataMonitorValueChanged(object sender, IList<DataMonitorValueChangedArgs> e)
        {
    
    
            foreach (var dmon in e)
                Console.WriteLine($"dmv:{dmon.Uid}:{dmon.Value},{dmon.Status}");
        }

        /// <summary>
        /// 盒子状态变更函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _fbox_BoxConnectStateChanged(object sender, IList<BoxConnectionStateItem> e)
        {
    
    
            //NewState:1、2是盒子在线状态。0、3为盒子不在线状态,根据盒子状态对盒子进行开点操作
            foreach (var stateItem in e)
            {
    
    
                Console.WriteLine($"{stateItem.BoxNo},{stateItem.NewState}");
            }
        }

        /// <summary>
        /// 开启盒子所有监控点
        /// </summary>
        public void StartAllDMonData()
        {
    
    
            //盒子每次掉线后,重新上线后均需要重新开点
            try
            {
    
    
                _fbox.StartAllDataMonitorPointsOnBox(new BoxArgs(boxNo)).Wait();//boxNo为盒子号
            }
            catch (Exception ex)
            {
    
    
                switch (ex.Message)
                    {
    
    
                        // 未登录服务器,请先Restart()
                        case "Box server not found.":; break;
                        // 当前账号下未找到BoxNo序列号的盒子
                        case "Not Found":; break;
                        default:; break;
                    }
            }
        }

        /// <summary>
        /// 获取盒子分组和盒子信息
        /// </summary>
        public void GetBoxGroups()
        {
    
    
            var grpList = _fbox.GetBoxGroups().Result;
            foreach (var grp in grpList)
            {
    
    
                Console.WriteLine(grp.Uid);                 // 盒子分组的Uid
                Console.WriteLine(grp.Name);                // 盒子分组名称
                foreach (var box in grp.Boxes)              // 遍历分组下的盒子集合
                {
    
    
                    Console.WriteLine(box.BoxId);           // 盒子Id
                    Console.WriteLine(box.Alias);           // 盒子名称
                    Console.WriteLine(box.BoxNo);           // 盒子号码
                    Console.WriteLine(box.ConnectionState); // 获取的时候盒子状态, 不能作为实时状态用,也不能一直调用这个接口来作为盒子状态变更,盒子状态变更请使用SignalR实时推送
                    Console.WriteLine(box.NetworkType);     // 网络类型   1:网络, 2:2G, 3:3G (这个不支持),4:Wifi ,5:4G 
                    Console.WriteLine(box.Disabled);        // 盒子是否被禁用
                    Console.WriteLine(box.ApiBaseUrl);      // ApiBaseUrl服务器地址
                    Console.WriteLine(box.SignalrUrl);      // SignalR服务器地址
                    Console.WriteLine(box.Owned);           // 是否为拥有者
                    Console.WriteLine(box.BoxType);         // 盒子类型, 0:标准盒子,1:mini盒子,2:Lite 3:VPN盒子
                }
            }
        }
        //定义方法
    }
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();
                fbox.StartAllDMonData();
                fbox.GetBoxGroups();
                //调用定义的方法
                Console.ReadLine();
            }
        }
    }
}

IFBoxClientManager インスタンスを作成して初期化するときは、clientId、clientsecret、ユーザー名、パスワード、ID サーバー、アプリ サーバー、および Hdata サーバーのパラメーターを指定する必要があります。
username と password は、FlexManager のアカウントとパスワードです。
clientId と clientsecret は、販売アプリケーションのアカウントとパスワードです。
Id サーバー、App サーバー、および Hdata サーバーがパブリック クラウドにある場合は変更されず、プライベート クラウドは対応するアドレスに変更されます。

第二に、具体的な操作方法

1.依存パッケージを導入する

特記事項:
1. この依存関係パッケージは、Visual Studio バージョン 15.3 以降に適用されます。
ステップ 1: VS2019 を使用して .NET Core コンソール プログラムを作成する
ステップ 2: NuGet 依存関係パッケージを導入する

FBoxClientDriver
FBoxClientDriver.Contract は
、たとえば、FBoxClientDriver パッケージを導入します。
方法 1

Visual Studio2019 コマンド ラインで次のステートメントを実行します
PM> Install-Package FBoxClientDriver
```

方法 2

以下に示すように、プロジェクトを Visual Studio 2019 にインポートし、依存パッケージ名を NuGet パッケージ ライブラリに導入します。
ここに画像の説明を挿入

2. 初期化

構成パラメーターを介してサーバーにログインします

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using FBoxClientDriver;
using FBoxClientDriver.Contract;
using FBoxClientDriver.Impl;

namespace SDKDEMO
{
    
    
    //配置参数
    public class FBoxClientParameters
    {
    
    
        public static string ClientId {
    
     get; set; } = "ClientId";
        public static string ClientSecret {
    
     get; set; } = "ClientSecret";
        public static string UserName {
    
     get; set; } = "UserName";
        public static string Password {
    
     get; set; } = "Password";
        public static string IdServer {
    
     get; set; } = "https://account.flexem.com/core";
        public static string MainServer {
    
     get; set; } = "http://fbox360.com";
        public static string HdataServer {
    
     get; set; } = "http://fbhs1.fbox360.com";
    }

    public class FBoxDemo : IDisposable
    {
    
    
        private readonly IFBoxClientManager _fbox;
        private readonly string boxNo = "300015050009"; // 以这个为例子

        public FBoxDemo()
        {
    
    
            //创建对象并初始化
            var provider =
                new DefaultCredentialProvider(FBoxClientParameters.ClientId, FBoxClientParameters.ClientSecret,
                    FBoxClientParameters.UserName, FBoxClientParameters.Password);
            _fbox = new FBoxClientManager(FBoxClientParameters.IdServer, FBoxClientParameters.MainServer,
                FBoxClientParameters.HdataServer, provider, Guid.NewGuid().ToString("N"), null);
        }

        public void Dispose()
        {
    
    
            _fbox?.Dispose();
        }

       /// <summary>
        /// 启动
        /// </summary>
        public void Start()
        {
    
    
            //初始化SDK,内部建立signalr连接对象,Restart只需全局执行一次。
            _fbox.Restart().Wait();
        }
    }
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                //调用启动方法,内部建立signalr连接对象,Restart只需全局执行一次。
                fbox.Start();

                Console.ReadLine();
            }
        }
    }
}

3. 指定した FBox のすべての監視ポイントを開く

現在のオンライン FBox のすべての監視ポイントのデータ プッシュを有効にします

/// <summary>
/// 开启盒子所有监控点
/// </summary>
public void StartAllDMonData()
{
    
    
    //盒子掉线后,每次上线均需要调此接口
    _fbox.StartAllDataMonitorPointsOnBox(new BoxArgs(boxNo)).Wait();//boxNo为盒子号
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
            }
        }
    }

観測点データのプッシュ
を有効にする 特定の観測点データのプッシュを有効にすることができます

/// <summary>
/// 开启监控点数据推送
/// </summary>
public void StartDmonData()
{
    
    
    // 调接口新增监控点后,需要调此接口才能收到新增点的数据推送
    _fbox.StartDataMonitorPoint(new DataMonitorPointArgs()
    {
    
    
        BoxNo = boxNo,                      //盒子号
        DataMonitorUid = 113470726140747285 //监控点Uid
    });
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartDmonData();//开启监控点
            }
        }
    }

4. ボックス状態変更プッシュ

サーバーが FBox の状態が変化したことを検出すると、
メッセージをプッシュします. メッセージの内容は配列
です. 単一のオブジェクトのプロパティは次のとおりです.

フィールド名 タイプ パラメータ 説明
ID ストリング FBox の ID
整数 ボックスの現在の状態、0: 不明、1: 接続済み、2: タイムアウト、3: 切断済み
ネット 整数 ボックス ネットワーク タイプ 1: ネットワーク 2: 2G、3: 3G (現在サポートされていません) 4: WIFI、5: 4G
RSSI 整数 シグナル: 0~8
に向かって json オブジェクト FBox ファームウェアのバージョン、fcs、fds、floader。
モード 整数 FBoxの状態 0:通常、1:透過送信

イベントを聞く

/// <summary>
/// 启动
/// </summary>
public void Start()
{
    
    
    // 通过参数登录服务器
    _fbox.Restart().Wait();
    //侦听盒子状态变更事件
    _fbox.BoxConnectStateChanged += _fbox_BoxConnectStateChanged;
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
            }
        }
    }
/// <summary>
/// 盒子状态变更函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _fbox_BoxConnectStateChanged(object sender, IList<BoxConnectionStateItem> e)
{
    
    
    foreach (var stateItem in e)
    {
    
    
        Console.WriteLine($"{stateItem.BoxNo},{stateItem.NewState}");
    }
}

5.リアルタイムデータプッシュ

前提条件: 監視ポイントが開かれ、ボックスがオフラインになるたびに、オンラインに戻った後に再度開く必要がある.
監視ポイントのデータが変更されるか、監視アイテムが開かれると、サーバーはメッセージをプッシュする. .

フィールド名 タイプ パラメータ 説明
boxSessionId 整数 とりあえず無視
json 配列 監視ポイントの値セット、単一属性の詳細を次の表に示します。
boxUid ストリング FBox の ID

値対応属性

フィールド名 タイプ パラメータ 説明
ID ストリング 監視ポイント エントリ uid
価値 ストリング 値、エントリが小数点以下の桁数で構成されている場合、プログラムは単独で転送する必要があり、サーバーは転送を行いません
状態 整数 エントリが OK の場合、このプロパティはありません 1: データなし、2: タイムアウト、3: エラー、4: ソケット例外、5: FDS エラー、16: 不完全

イベントを聞く

/// <summary>
/// 启动
/// </summary>
public void Start()
{
    
    
    // 通过参数登录服务器
    _fbox.Restart().Wait();
    //侦听实时数据变更事件
    _fbox.DataMonitorValueChanged += _fbox_DataMonitorValueChanged;
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
            }
        }
    }
/// <summary>
/// 实时数据变更函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _fbox_DataMonitorValueChanged(object sender, IList<DataMonitorValueChangedArgs> e)
{
    
    
    foreach (var dmon in e)
        Console.WriteLine($"dmv:{dmon.Uid}:{dmon.Value},{dmon.Status}");
}

6. ボックス情報とボックスのグループ化を取得する

/// <summary>
/// 获取盒子分组和盒子信息
/// </summary>
public void GetBoxGroups()
{
    
    
    var grpList = _fbox.GetBoxGroups().Result;
    foreach (var grp in grpList)
    {
    
    
        Console.WriteLine(grp.Uid);                 // 盒子分组的Uid
        Console.WriteLine(grp.Name);                // 盒子分组名称
        foreach (var box in grp.Boxes)              // 遍历分组下的盒子集合
        {
    
    
            Console.WriteLine(box.BoxId);           // 盒子Id
            Console.WriteLine(box.Alias);           // 盒子名称
            Console.WriteLine(box.BoxNo);           // 盒子号码
            Console.WriteLine(box.ConnectionState); // 获取的时候盒子状态, 不能作为实时状态用,也不能一直调用这个接口来作为盒子状态变更,盒子状态变更请使用SignalR实时推送
            Console.WriteLine(box.NetworkType);     // 网络类型   1:网络, 2:2G, 3:3G (这个不支持),4:Wifi ,5:4G 
            Console.WriteLine(box.Disabled);        // 盒子是否被禁用
            Console.WriteLine(box.ApiBaseUrl);      // ApiBaseUrl服务器地址
            Console.WriteLine(box.SignalrUrl);      // SignalR服务器地址
            Console.WriteLine(box.Owned);           // 是否为拥有者
            Console.WriteLine(box.BoxType);         // 盒子类型, 0:标准盒子,1:mini盒子,2:Lite 3:VPN盒子
        }
    }
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.GetBoxGroups();//调用此方法
            }
        }
    }

7. ボックスの監視点グループと監視点エントリを取得する

/// <summary>
/// 获取盒子监控点分组和监控点条目
/// </summary>
/// <returns></returns>
public IList<DmonItemDtoV2> GetDmonGroups()
{
    
    
    var dmonGrps = _fbox.GetDmonGroupDmonsV2(new BoxArgs(boxNo)).Result;
    foreach (var grp in dmonGrps)
    {
    
    
        Console.WriteLine(grp.Id);          // 监控点分组的Id
        Console.WriteLine(grp.Name);        // 监控点分组的名称
        foreach (var item in grp.Items)     // 遍历当前分组grp下所有的监控点条目
        {
    
    
            Console.WriteLine(item.Id);     //监控点Id
            Console.WriteLine(item.Name);   //监控点名称
            Console.WriteLine(item.DevAlias); //PLC别名
            Console.WriteLine(item.StationNo); //站号
            Console.WriteLine(item.IsDeviceChanged);//设备是否被移除(只有在移除时出现该参数,为true)FBox的连接设备変更后会出现该参数
            Console.WriteLine(item.TaskState);  //条目状态
            Console.WriteLine(item.DeadValue);  //死值区
            Console.WriteLine(item.BitIndex);   //按位索引号
            Console.WriteLine(item.BitIndexEnabled);//是否启用按位索引号
            Console.WriteLine(item.BitStateLabel);//位类型数据标签
            Console.WriteLine(item.CharCount);  //字符个数
            Console.WriteLine(item.DataType);   //数据类型
            Console.WriteLine(item.Encoding);   //编码方式
            Console.WriteLine(item.FractionalDigits);//小数位
            Console.WriteLine(item.GroupId);    //监控点分组
            Console.WriteLine(item.GroupName);  //监控点名称
            Console.WriteLine(item.IntegralDigits);//整数位(目前无作用)
            Console.WriteLine(item.IoWidth);    //寄存器位宽
            Console.WriteLine(item.MainAddress);//主地址
            Console.WriteLine(item.Memo);       //备注
            Console.WriteLine(item.Privilege);  //读写模式
            Console.WriteLine(item.RegId);      //寄存器Id
            Console.WriteLine(item.RegName);    //寄存器名称
            Console.WriteLine(item.StringByteOrder);//字节序
            Console.WriteLine(item.SubAddress); //子地址
            Console.WriteLine(item.SubIndex);   //DB块地址
            Console.WriteLine(item.TrafficSaving);//是否开启省流量模式
            Console.WriteLine(item.Unit);       //单位
            Console.WriteLine(item.ValueTransform);//数据运算
        }
    }
    return dmonGrps.SelectMany(x => x.Items).ToArray();//监控点条目集合
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.GetDmonGroups();//调用此方法
            }
        }
    }

8. モニタリングポイント値書き込み

/// <summary>
/// 监控点写值
/// </summary>
/// <param name="requet"></param>
public void WriteDmonValue(WriteDmonRequest requet)
{
    
    
    _fbox.WriteValue(new DataMonitorWriteValueArgsV2()
    {
    
    
        BoxNo = requet.BoxNo,                     //盒子号
        DataMonitorGroupName = requet.DmonGrpName,//监控点组名称
        DataMonitorName = requet.DmonName,        //监控点条目名称
        Value = requet.Value,                     //条目的值
        Type = WriteValueType.AutoParse //条目值类型,0:和监控点值类型一致,1:十进制,2:字符串,
    }).Wait();
}

public class WriteDmonRequest
{
    
    
    public string BoxNo {
    
     get; set; }
    public string DmonGrpName {
    
     get; set; }
    public string DmonName {
    
     get; set; }
    public object Value {
    
     get; set; }
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.WriteDmonValue();//调用此方法
            }
        }
    }

9. ドライブ操作

ボックスの下にあるすべての PLC を取得する

/// <summary>
/// 获取盒子下的所有PLC
/// </summary>
public void GetPlcs()
{
    
    
    var boxplc = _fbox.GetPlcDeviceV2(new BoxArgs()
    {
    
    
        BoxNo = boxNo                              //盒子号
    }).Result;
    foreach (var plc in boxplc)
    {
    
    
        Console.WriteLine(plc.Alias);               //plc别名
        Console.WriteLine(plc.BaudRate);            //波特率
        Console.WriteLine(plc.BroadcastStationNo);  //广播站号
        Console.WriteLine(plc.Class);//设备类型,0:主设备,1:从设备,2:主从设备(目前不支持)
        Console.WriteLine(plc.DataBits);            //数据位
        Console.WriteLine(plc.DefaultStationNo);    //默认广播站号
        Console.WriteLine(plc.EnableBroadcast);     //使能广播站号
        Console.WriteLine(plc.Interface);//串口接口类型,0:RS232,1:RS485_2,2:RS485_4,85:网络(串口1支持RS232、RS485_2和RS485_4,串口2仅支持RS485_2,串口3仅支持RS232)
        Console.WriteLine(plc.Ip);        //IP地址
        Console.WriteLine(plc.ParityType);//校验位,none:无校验,odd:奇校验,even:偶校验
        Console.WriteLine(plc.PlcAdvancedSettings); //高级设置
        Console.WriteLine(plc.PlcDongleFlag);  //远程停机状态
        Console.WriteLine(plc.PlcId);         //PLCId
        Console.WriteLine(plc.SlaveNo);        //从设备号
        Console.WriteLine(plc.StopBits);     //停止位
        Console.WriteLine(plc.PlcName);      //PLC名称
        Console.WriteLine(plc.Type);       //类型,0:串口,2:以太网
        Console.WriteLine(plc.Port);       //以太网端口号
        Console.WriteLine(plc.PortNo);     //站号
    }
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.GetPlcs();//调用此方法
            }
        }
    }

PLCをダウンロード

/// <summary>
/// 下载PLC
/// </summary>
public void DownloadPlc()
{
    
    
    _fbox.DownLoadPlcsV2(new AddOrUpdatePlcDeviceArgsV2()
    {
    
    
        BoxNo = boxNo,
        PlcList = new List<AddOrUpdatePlcDeviceV2>()
        {
    
    
            //以下为下载一个plc为例
            //注意,本方法下载plc时会覆盖之前的plc,如需多个plc,自行添加
            new AddOrUpdatePlcDeviceV2()
            {
    
    
                PlcId =  305,                       //PLCId
                PlcName = "ABB",                    //PLC名称
                Alias = "ABB AC500_RTU",            //别名
                Type = ServerType.Serial,     //类型,0:串口,2:以太网
                PortNo = 1,                        //编号
                Class = PlcClass.Master,       //设备类型,0:主设备,1:从设备,2:主从设备(目前不支持)
                DefaultStationNo = 1,               //默认站号
                Interface = DeviceInterfaceTypes.Tcp,//串口接口类型,0:RS232,1:RS485_2,2:RS485_4,85:网络(串口1支持RS232、RS485_2和RS485_4,串口2仅支持RS485_2,串口3仅支持RS232)
                BaudRate = 9600,                   //波特率
                Port = 0,                       //网络设备端口号
                DataBits = 8,                     //数据位
                StopBits = 1,                      //停止位
                ParityType = ParityType.None, //校验位,none:无校验,odd:奇校验,even:偶校验
                Ip = "0",                        //IP地址
                EnableBroadcast = false,      //是否启动广播站号
                BroadcastStationNo = 0,        //广播站号
            }
        }
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.DownloadPlc();//调用此方法
            }
        }
    }

10. 観測点操作

観測点エントリを追加

監視ポイントを追加したら、SignalR に接続し、追加した監視ポイントのデータ プッシュを有効にする必要があります。

/// <summary>
/// 新增监控点条目
/// </summary>
public void AddDMon()
{
    
    
    _fbox.AddDataMonitorPointV2(new AddDmonsArgsV2()
    {
    
    
        AddDmons = new List<AddDataMonitorDefinitionV2>()
        {
    
    
            new AddDataMonitorDefinitionV2()
            {
    
    
                GroupName =  "fff",//监控点分组名称,和groupId任选一个使用,若使用不存在的监控点分组,则会自动增加该分组
                Name  = "xxxxx",//监控点名称
                DevAlias = "Local",//PLC别名
                StationNo = 1,//站号
                DataType = DataType.Int16,//数据类型,详情见接口文档中附录二
                RegName = "LW",//寄存器名称,和regId、iowidth确定唯一寄存器
                Privilege = PrivilegeType.ReadWrite,//读写权限,2:Write,4:ReadOnly,6:ReadWrite,
                //地址请根据设备的配置进行填写
                MainAddress =  5,//主地址
                SubAddress = 0,//子地址
                SubIndex = 0,//DB块地址
                BitIndexEnabled = false,//是否启用按位索引
                IntegralDigits = 0,//整数位(目前无作用)
                FractionalDigits = 1,//小数位
                Unit = "度",//单位,仅对字类型有效
                TrafficSaving = false,//是否启用省流量模式,true:启用,false:不启用
                BitStateLabel = new BitStateLabel(){
    
    FalseLabel = "关机",TrueLabel = "开机"},//位类型时显示标签,属性ttext:值为1时显示的文本,ftext:值为0时显示的文本
                Memo = "xxx",//备注
                DeadValue = 0,//死区值,数据再±deadValue范围内数据不推送
                //只有在DataType = DataType.String(字符串类型) 时有以下参数
                //Encoding = EncodeType.None,//编码格式,字符串类型使用0:无,非字符串类型使用,1:Unicode,2:Ascii
                //StringByteOrder = StringByteOrder.O12,//字符串字节序,编码为Ascii格式时有效0:倒序,1:正序
                //CharCount = 5, //字符个数
            }
        },
        BoxNo = boxNo,//盒子号
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.AddDMon();//调用此方法
            }
        }
    }

ウォッチポイント エントリの更新

監視ポイントを追加したら、SignalR に接続し、監視ポイント データのプッシュを有効にする必要があります。

/// <summary>
/// 更新监控点条目
/// </summary>
public void UpdateDmon()
{
    
    
    _fbox.UpdateDataMonitorPointV2(new UpdateDmonArgsV2()
    {
    
    
        BoxNo = boxNo,//盒子号
        UpdateDmonList = new List<UpdateDataMonitorDefinitionV2>()
        {
    
    
            new UpdateDataMonitorDefinitionV2()
            {
    
    
                Id = 113470726140747285,//需要更新条目的Id
                GroupName = "fff",//监控点分组名称,和groupId任选一个使用,若使用不存在的监控点分组,则会自动增加该分组
                Name = "ggg",//监控点名称
                DevAlias = "Local",//PLC别名
                StationNo = 1,//站号
                DataType = DataType.Int16,//数据类型,详情见接口文档中附录二
                RegName = "LW",//寄存器名称,和regId、iowidth确定唯一寄存器
                //地址请根据设备的配置进行填写
                MainAddress = 9,//主地址
                SubAddress = 0,//子地址
                SubIndex = 0,//DB块地址
                IntegralDigits = 0,//整数位(目前无作用)
                FractionalDigits = 1,//小数位
                Unit = "度",//单位
                Privilege = PrivilegeType.ReadOnly,//读写权限,2:Write,4:ReadOnly,6:ReadWrite,
                TrafficSaving = true,//是否启用省流量模式,true:启用,false:不启用
                DeadValue = 15,//死区值,数据再±deadValue范围内数据不推送
                BitStateLabel =  new BitStateLabel(),//位类型时显示标签,属性ttext:值为1时显示的文本,ftext:值为0时显示的文本
                Memo = "ggg",//备注
                Encoding = EncodeType.None//编码格式,字符串类型使用0:无,非字符串类型使用,1:Unicode,2:Ascii
            }
        }
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.UpdateDmon();//调用此方法
            }
        }
    }
删除监控点条目
/// <summary>
/// 删除监控点条目
/// </summary>
public void RemoveDmon()
{
    
    
    List<long> ids = new List<long> {
    
     113470815205744205 };
    _fbox.RemoveDataMonitorPointV2(new RemoveDataMonDefArgsV2()
    {
    
    
        BoxNo = boxNo, //盒子号
        Ids = ids      //需要删除的监控点条目Id集合
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.RemoveDmon();//调用此方法
            }
        }
    }

11. アラーム操作

ボックスの下にあるすべてのアラーム エントリを取得する

/// <summary>
/// 获取盒子底下所有的报警条目
/// </summary>
/// <returns></returns>
public IList<AlarmDefintitionDtoV2> GetAlarmItems()
{
    
    
    var allitems = _fbox.GetAllAlarmDefinitionsV2(new BoxArgs()
    {
    
    
        BoxNo = boxNo
    }).Result;
    foreach (var items in allitems)
    {
    
    
        Console.WriteLine(items.TaskState);    //条目状态
        Console.WriteLine(items.AlarmGroup);   //报警分组
        Console.WriteLine(items.AlarmMessage); //报警信息
        Console.WriteLine(items.Code);         //报警条目编码
        Console.WriteLine(items.Condition1);   //报警条件一
        Console.WriteLine(items.ConditionCombineMethod);//条件组合
        Console.WriteLine(items.Id);            //报警条目Id
        Console.WriteLine(items.IsDeviceChanged);//设备是否已经变更
        Console.WriteLine(items.Memo);          //备注
        Console.WriteLine(items.Name);          //报警条目名称
        Console.WriteLine(items.Operand1);      操作数,若选择Bit数据类型,操作数0为OFF,1为ON
        Console.WriteLine(items.Condition2);    //报警条件二
        Console.WriteLine(items.Operand2);      //操作数二
    }
    return allitems;
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.GetAlarmItems();//调用此方法
            }
        }
    }

アラーム履歴エントリを取得する

/// <summary>
/// 获取报警历史记录
/// </summary>
public void GetAlarmHistory()
{
    
    
    var hdata = _fbox.GetAlarmEvents(new AlarmEventQuery()
    {
    
    
        BeginTime = DateTime.Parse("2018-4-5"), //开始时间 long型的utc时间戳unix epoch
        BoxNo = boxNo,                          //盒子号
        EndTime = DateTime.Parse("2018-4-24"),  //结束时间 long型的utc时间戳unix epoch
        Limit = 500,                            //获取条数限制,结果条数限制 负值为向前查询,建议使用500.
        Name = "313265"                         //报警条目的编码,若全查则无需该参数
    }).Result;
    foreach (var data in hdata)
    {
    
    
        Console.WriteLine(data.Action);         //类型
        Console.WriteLine(data.AlarmId);        //报警条目Id
        Console.WriteLine(data.Code);           //报警条目编码
        Console.WriteLine(data.Message);        //报警信息
        Console.WriteLine(data.Value);          //监控点值
        Console.WriteLine(data.TimestampUnixEpoch); //时间戳
    }
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.GetAlarmHistory();//调用此方法
            }
        }
    }

アラームエントリを追加

/// <summary>
/// 新增报警条目
/// </summary>
public void AddAlarm()
{
    
    
    _fbox.AddAlarmDefinitionV2(new AddAlarmDefArgsV2()
    {
    
    
        AddAlarms = new List<AddAlarmDefinitionV2>()
        {
    
    
            new AddAlarmDefinitionV2()
            {
    
    
                Name = "报警名称",        // 新增报警条目名称是唯一的,不可同名
                DevAlias = "Modbus_TCP", //设备驱动别名
                StationNo = 1,          //PLC通讯站号
                DataType = DataType.Bit, //数据类型,详情见接口文档中附录二
                RegName = "4X_bit",    //寄存器名称,和regId、iowidth确定唯一寄存器
                //地址请根据报警条目需要检测的监控点配置
                MainAddress = 8, //主地址
                SubAddress = 0,//子地址
                SubIndex = 0,//DB块地址
                AlarmMessage = "XXXX",  //报警信息
                GroupName = "报警分组", //报警点分组名称或使用GroupId报警分组Id,优先名称
                Memo = "",             //备注
                //以下为报警条件
                Condition1 = AlarmConditionType.Eq,//触发报警条件类型,报警条件一,0:不等于,1:等于,2:大于,3:大于等于,4:小于,5:小于等于
                Operand1 = 80,  //条件值
                ConditionCombineMethod = AlarmConditionCombineMethod.And, //条件联合,None:无,And:与,Or:或
                Condition2 = AlarmConditionType.Eq,//触发报警条件类型,报警条件一,0:不等于,1:等于,2:大于,3:大于等于,4:小于,5:小于等于
                Operand2 = 90 //条件值
            }
        },
        BoxNo = boxNo     //新增报警条目的盒子号
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.AddAlarm();//调用此方法
            }
        }
    }

アラーム エントリの更新

/// <summary>
/// 更新报警条目
/// </summary>
public void UpdateAlarm()
{
    
    
    _fbox.UpdateAlarmDefinitionV2(new UpdateAlarmDefArgsV2()
    {
    
    
        BoxNo = boxNo,//报警条目的盒子号
        UpdateAlarms = new List<UpdateAlarmDefinitionV2>()
        {
    
    
            new UpdateAlarmDefinitionV2()
            {
    
    
                Id = 113522543645056649,//报警条目的Id
                Name = "修改了", //报警条目名称 
                DevAlias = "Modbus_TCP",//设备驱动别名
                StationNo = 1, //PLC通讯站号
                DataType = DataType.Int16,//数据类型,详情见接口文档中附录二
                RegName = "4X",//寄存器名称,和regId、iowidth确定唯一寄存器
                //地址请根据报警条目需要检测的监控点配置
                MainAddress = 2, //主地址
                SubAddress = 0,//子地址
                SubIndex = 0,//DB块地址
                GroupName = "报警分组",//报警分组名称,与groupId使用一个即可
                //以下为报警条件
                Condition1 = AlarmConditionType.Lt,//触发报警条件类型,报警条件一,0:不等于,1:等于,2:大于,3:大于等于,4:小于,5:小于等于
                Operand1 = 12,//条件值一,若选择Bit数据类型,操作数0为OFF,1为ON
                ConditionCombineMethod = AlarmConditionCombineMethod.And, //条件联合,None:无,And:与,Or:或
                Condition2 = AlarmConditionType.Eq,//触发报警条件类型,报警条件二,0:不等于,1:等于,2:大于,3:大于等于,4:小于,5:小于等于
                Operand2 = 90 //条件值二
            }
        }
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.UpdateAlarm();//调用此方法
            }
        }
    }

アラームエントリを削除

/// <summary>
/// 删除报警条目
/// </summary>
public void RemoveAlarm()
{
    
    
    var ids = new List<long>(){
    
     110424333146494353};
    _fbox.RemoveAlarmDefinitionV2(new RemoveAlarmDefArgsV2()
    {
    
    
        BoxNo = boxNo,      //盒子号
        Ids = ids           //删除的报警条目UId
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.RemoveAlarm();//调用此方法
            }
        }
    }

12.歴史的な操作

過去のマルチチャネル データを取得する

/// <summary>
/// 获取历史记录多通道数据
/// </summary>
public IList<ByRowHistoryDataRow> GetHdataHistory()
{
    
    
    var hdata =  _fbox.GetByRowHistoryData(new GetHistoryDataArgs()
    {
    
    
        BoxNo = boxNo,                                //盒子号
        StartTime = DateTime.Parse("2018-06-06 08:58:32"),       //起始时间
        EndTime = DateTime.Parse("2018-06-07 08:58:32"),        //结束时间
        Limit = 500,                                 //最大获取数据条数
        TimeRange = TimeRangeTypes.BeginOpenEndOpen, //区间类型,BeginCloseEndClose:全毕区间,BeginCloseEndOpen:左闭右开,BeginOpenEndClose:左开右闭,BeginOpenEndOpen:全开区间
        HdataItemName = "XX",                        //历史数据条目名称
        HdataChannelNames = new List<string>() {
    
     "11", "22"}//通道名称
    }).Result;
    foreach (var d in hdata.Rows)
    {
    
    
        Console.WriteLine(d.Time); // 历史数据条目的采集时间
        Console.WriteLine(d.Values[0]); // 对应通道名称集合中的第一个元素
        Console.WriteLine(d.Values[1]); // 对应通道名称集合中的第二个元素
    }
    return hdata.Rows;
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.GetHdataHistory();//调用此方法
            }
        }
    }

履歴エントリを取得する

/// <summary>
/// 获取历史记录条目
/// </summary>
public void GetHdataList()
{
    
    
    var itemlist =  _fbox.GetHdataItems(new BoxArgs()
    {
    
    
        BoxNo = boxNo                                       //盒子号
    }).Result;
    foreach (var items in itemlist)
    {
    
    
        Console.WriteLine(items.BoxId);                     //盒子Id
        foreach (var channels in items.Channels)
        {
    
    
            Console.WriteLine(channels.Uid);                //通道Id
            Console.WriteLine(channels.HasSubAddress);      //寄存器是否有子地址
            Console.WriteLine(channels.HasSubIndex);        //寄存器是否有DB块地址
            Console.WriteLine(channels.DataType);           //数据类型,详情见接口文档中附录二
            Console.WriteLine(channels.MainAddress);        //主地址
            Console.WriteLine(channels.RegName);            //寄存器名称
            Console.WriteLine(channels.RegId);              //寄存器Id
            Console.WriteLine(channels.IoWidth);            //寄存器位宽
            Console.WriteLine(channels.StationNo);          //站号
            Console.WriteLine(channels.SubAddress);         //子地址
            Console.WriteLine(channels.DevAlias);           //PLC别名
            Console.WriteLine(channels.SubIndex);           //DB块地址
        }
        Console.WriteLine(items.Name);                      //名称
        Console.WriteLine(items.RecordingPeriod);           //采集周期
        Console.WriteLine(items.Uid);                       //主键
        Console.WriteLine(items.IsControl);                 //是否使用使能
    }
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.GetHdataList();//调用此方法
            }
        }
    }

履歴エントリを追加

/// <summary>
/// 新增历史记录多通道
/// </summary>
public void AddHdata()
{
    
    
    _fbox.AddHdataItems(new AddHdataItemArgs()
    {
    
    
        BoxNo = boxNo,                          //盒子号
        HdataItems = new List<AddHdataItemDto>()
        {
    
    
            //以下为增加一个通道为例,增加多个通道自行增加
                    new AddHdataChannelsDto()
                    {
    
    
                        ChannelName = "xxx",    //通道名称
                        AddressDescription = "LW",//地址描述
                        StationNo = 2,          //站号
                        DataType = DataType.Bcd16,//数据类型,详情见接口文档中附录二
                        DevAlias = "Modbus_TCP",  //PLC别名
                        RegName = "4X",        //寄存器名称,与regId,iowidth确认唯一寄存器
                        //请根据设备的配置填写
                        MainAddress = 5,        //主地址
                        SubAddress = 0,         //子地址
                        SubIndex = 0,           //DB块地址
                        BitIndex = 0,           //按位索引号
                        BitIndexEnabled = false,//是否启用按位索引 
                        FractionalDigits = 1,   //通道小数位
                    }
                },
                IsControl = true, //是否使能控制
                //当使能控制为true时,填写以下使能参数
                ControlOptions = new HDataControlOptionsV2()//使能参数
                {
    
    
                    ControlType = HControlType.OFF,//使能配置,0:OFF,1:ON
                    DataType = DataType.Bit,    //数据类型,详情见接口文档中附录二
                    DevAlias = "Modbus_TCP",    //PLC别名
                    StationNo = 2,              //站号
                    RegName = "4X_bit",         //寄存器名称,和regId、iowidth确定唯一寄存器
                    //请根据设备的配置填写
                    MainAddress = 2,            //主地址
                    SubAddress = 3,             //子地址
                    AddressDescription = "LW",  //地址描述
                    BitIndex = 2,               //按位索引号
                    BitIndexEnabled = false     //是否启用按位索引
                }
            }
        }
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.AddHdata();//调用此方法
            }
        }
    }

更新履歴エントリ

/// <summary>
/// 更新历史记录多通道
/// </summary>
public void UpdateHdata()
{
    
    
    _fbox.UpdateHdataItems(new UpdateHdataItemArgs()
    {
    
    
        BoxNo = boxNo,
        HdataItems = new List<UpdateHdataItemDto>()
        {
    
    
            //以下为更新一个通道为例
                    new UpdateHdataChannelsDto()
                    {
    
    
                        Uid = 97427676249298676, //通道Uid
                        ChannelName = "15",//通道名称
                        DevAlias = "ABB AC500_RTU",//PLC别名
                        StationNo = 2,//站号
                        DataType =   DataType.Int16,//数据类型,详情见接口文档中附录二
                        RegName = "4X",//寄存器名称,与regId,iowidth确认唯一寄存器
                        //请根据设备的配置进行填写
                        MainAddress = 7,//主地址
                        SubAddress = 0,//子地址
                        SubIndex = 0,//索引地址
                        Unit = "°",//单位
                        IntegralDigits = 0,//整数位
                        FractionalDigits = 2//小数位
                    }
                },
                IsControl = true,   //是否启用使能配置
                //当启用使能配置时,请配置使能参数
                ControlOptions = new HDataControlOptionsV2()//使能参数
                {
    
    
                    ControlType = HControlType.OFF,//使能状态,0:OFF,1:ON
                    DataType = DataType.Bit,  //数据类型,详情见接口文档中附录二
                    DevAlias = "ABB AC500_RTU",   //PLC别名
                    StationNo = 2,              //站号
                    RegName = "0X",             //寄存器名称与regId,iowidth确认唯一寄存器
                    //请根据设备的配置进行填写
                    MainAddress = 2,            //主地址
                    SubAddress = 0,             //子地址
                    AddressDescription = "ABB",  //地址描述
                    BitIndex = 0,               //按位索引号
                    BitIndexEnabled = false     //是否启用按位索引
                },
            }
        }
    });
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.UpdateHdata();//调用此方法
            }
        }
    }
删除历史记录条目
/// <summary>
/// 删除历史记录条目
/// </summary>
public void RemoveHdata()
{
    
    
    _fbox.RemoveHdataItem(new RemoveHdataItemArgs()
    {
    
    
        BoxNo = boxNo,                                  //盒子号
        Ids = new List<long>() {
    
     85289974828733605 }    //历史记录Id集合
    }).Wait();
}
//在Program,Main函数中调用
class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            using (var fbox = new FBoxDemo())
            {
    
    
                fbox.Start();  //启动
                fbox.StartAllDMonData();//开启FBox所有监控点
                fbox.RemoveHdata();//调用此方法
            }
        }
    }

要約する

以上が本日のお話になりますが、この記事ではFlexManagerをベースにしたVisual Studioのアプリケーション開発について簡単に紹介しただけで、FlexManagerにはクラウドデータを利用したクライアントアプリケーションの作成方法がたくさんありますので、学生はそれらについてより詳しく学ぶことができます。次の記事では、FlexManagerをベースにしたデータクラウド転送の実際の動作詳細について説明しますので、学生の方はさらに勉強してください。

おすすめ

転載: blog.csdn.net/weixin_41729677/article/details/126561762