Loggerと直接通信しデータ収集可能なPLCメーカ、型式は以下に限られます。
三菱電機製のPLCでは専用の通信ソフトであるMX-Componentを使用します。入手、インストールについてはMX-Componentのインストールを参照ください。
| メーカ | PLC型式、シリーズ |
| 三菱電機 | Aシリーズ、Rシリーズ、Qシリーズ、FXシリーズ (MX-Componentの対応機種) |
| キーエンス | KVシリーズ(Ethernet対応機種) |
| オムロン | CJ/CS/CPシリーズ、CVシリーズ (Ethernet、FINS通信対応機種) |
Loggerとの通信設定 #
①「設備種類選択」にて「PLC」を選択し、②次へ、をクリック

③「PLC設定」でデータ取得方法を「Loggerで直接通信」に設定し、④PLCデバイスの種類から接続するPLCメーカを選択

以下の手順はPLCメーカによって異なるため、対応するPLCメーカの手順を参考してください。
(1)三菱製PLC (2)オムロン製PLC (3)キーエンス製PLC
(1)三菱製PLC #
・事前に通信設定用ソフトであるMX-Componentの対応バージョンをインストールします(→インストール手順は別マニュアル参照)。
・論理局番はMX-Componentにて設定した番号と合わせてください。
・通信設定ユーティリティの「実行」ボタンをクリックすると通信設定ユーティリティソフトが起動します。

・通信設定ユーティリティソフトの通信設定タブから「ウィザード」ボタンをクリックすると、通信設定ウィザートの画面が表示されます。この画面で論理局番を設定し(0-1023、任意)次へをクリック。

・続いてPLCとの接続方法の設定画面が表示されます。
(ここではEthernet通信を例にしますが、RS232CやEasySocketの場合、それらに合わせて設定ください。)
・パソコン側I/FでEthernetボードを選択し、続いて接続先ユニットタイプをCPUユニット、または対応するEthernetユニットの型式、通信プロトコルを選択して「次へ」をクリックします。

・シーケンサ側I/FでCPUユニットを選択し、ホスト名(IPアドレス)にPLC側のIPアドレスを入力して「次へ」をクリックします。

・通信経路設定にてLoggerとCPUを直接接続している場合は局番タイプを自局を選択(別のCPUを経由したい場合などは他局)し、CPUタイプで使用しているPLC型式を選択して「次へ」をクリックします。

・以上で設定が完了です。複数のPLCに接続する場合などは論理局番(通信設定内容)が複数になるため必要に応じて識別しやすいコメントを入力し、「完了」をクリックします。

・設定が完了したら「通信テスト」のタブで「テスト」ボタンをクリックし、通信テストを実行してください。通信が問題なくできていれば「通信テストが完了しました。」とメッセージが表示され、設定は完了です。「終了」をクリックしてウィンドウを閉じてください。

(2)オムロン製PLC #
接続するPLCのIPアドレス、ポート番号を入力します。これらの値は設備の仕様書やネットワーク構成図等を参照してください。
CPUタイプはCJ/CS/CPシリーズ、またはCVシリーズかによってプルダウンリストから選択してください。

(3)キーエンス製PLC #
接続するPLCのIPアドレス、ポート番号を入力します。これらの値は設備の仕様書やネットワーク構成図等を参照してください。

取得データ設定 #
・「PLCデータ設定2」のタブでデータ取得項目を設定します。

①「データ処理スクリプトファイル」
単純にPLCのデバイス値を読取るだけでは目的のデータが得られず、内部で計算処理や条件判定が必要なケースにスクリプトを使用して計算することができます。こうした場合はで実行するスクリプトファイルを指定してください。
②「ロギングインターバル」
サンプリング周期を指定してください。現在PLC接続では最小50msecまで指定可能です。
③「データ数」
工程データに表示するトレンドデータの数を入力してください。最大300個まで指定可能です。
④個別データ設定
<名称>
工程データ表示の際の表示名となります。わかりやすい名称を入力してください
<タイプ>
PLC読込 -> 読取ったデバイス値をそのまま(or スケール変換等の単純処理値)データとして使用します。
未設定 -> デバイス値がそのまま使用できず、計算処理が必要な場合にスクリプト使うデータに使用します。
定数 -> デバイス値やスクリプト処理によらず、一定の値で表示したいものに使用します。
<アドレス>
タイプで「PLC読込」としたデータは取得したいデバイスのアドレスを入力します。
<型>
以下から各デバイスに対応するものを選択
| 型 | 説明 |
| BOOL | true/false値、X,Y,Mなどのリレーデバイスに使用 取得した値はtrue=1, false=0として表示します。 |
| SHORT | 符号(+、-)付、16bit整数(-32,768 to +32,768) |
| USHORT | 符号無、16bit整数(0 to 65,536) |
| LONG | 符号付、64bit整数 (-9,223,372,063,854,775,808 to +9,223,372,063,854,775,808) |
| ULONG | 符号無、64bit整数 (0 to +18,446,744,073,709,551,615) |
| STRING | ASCII文字列 |
<文字数>
データ型がSTRINGの場合には文字数を指定します。
<バイトスワップ>
STRING型などで値を逆に読む必要がある場合にチェックしてください。
<定数>
タイプで「定数」を選択した場合、ここに入力した値がデータに反映されます。
<スケール変換>
小数点補正や、アナログ電流/電圧の変換が必要な場合にチェックを入れて使用します。変換は下図のように1次の線形補間で計算され、入力値の範囲外は外挿値が表示されます。

⑤「インポート」「エクスポート」
設定データが多い場合などはエクセルシートのインポート/エクスポートに対応しています。

⑥スクリプト用データ
工程データに表示する必要はなくとも、スクリプト内で条件判定等に使用するデータはこちらにデータ取得設定を行ってください(最大100個)。
⑦設定完了したら「OK」をクリックして設定を完了します。

計算処理の必要なデータのスクリプト作成 #
単純にPLCのデバイス値を読取るだけでは目的のデータが得られず、内部で計算処理や条件判定が必要なケースにスクリプトを使用して計算することができます。Javascriptを使用します。メモ帳や一般的なテキストエディタでスクリプトを作成、編集してください。
以下にサンプルコードを添付します。
熱処理装置サンプルスクリプト1
// グローバル変数
var Endflag = 1;
var D9033Prev = 0;
// 初期化関数 Logger起動後に1回だけ実行します。
function Initialize() {
}
// ロギング関数 Loggerのロギングの1サイクルごとに実行します。getPlcValue関数でPLC値を取得します。setFieldでロギングデータを設定します。
function Logging() {
//alarm定義、取得
var alarm = [
['1', 'オーバフロータンク満水',getPlcValue('M1143')],
['2', '加工不良', getPlcValue('M1341')],
['3', '焼入機操作手動', getPlcValue('X10A3')]
];
var alarmcnt = alarm.length;//アラーム定義数を取得
var alarmexist = 0;//アラームの有無
for (i = 0; i < alarmcnt; i++){
alarmexist += alarm[i][2];
}
//operatingstatus
var stat = [];
stat[1] = 'D9040';//STEP番号
stat[2] = 'D9033';//行程
stat[3] = 'D9092';//発信機出力電力測定値
stat[4] = 'D9099';//焼入水流量1測定値
stat[5] = 'D9100';//焼入水流量2測定値
stat[6] = 'D9101';//焼入水流量3測定値
stat[7] = 'D9102';//焼入水流量4測定値
stat[8] = 'D9103';//焼入水流量5測定値
stat[9] = 'D9104';//焼入水流量6測定値
stat[10] = 0;
for (let i = 1; i < 10; i++){
stat[i] = getPlcValue(stat[i]);
stat[10] = stat[10]+(i > 3 ? stat[i] : 0);
};
//工程が2なら工程間停止
if (stat[2] === 2){
setField('operatingstatus',4);
}else{
//アラームがなければ作業中
if (alarmexist === 0){
if ((stat[3] > 0) || (stat[10] > 0)){
setField('operatingstatus',1);
}else{
setField('operatingstatus',2);
}
}else{
//アラームが出てれば工程内停止
setField('operatingstatus', 3);
}
}
//endflag
if ((stat[2] < D9033Prev)){
Endflag = -1 * Endflag;
}else{
Endflag = Endflag;
}
setField('endflag',Endflag);
D9033Prev = stat[2];
//datatag
setField('datatag','KOMATSU');
//BlockNum
var Block;
var PrcMode = getPlcValue('D9031');
var StpNo = getPlcValue('D9040');
var HtPrcNo = getPlcValue('D9050');
if (PrcMode === 0){
Block = StpNo;
}else{
Block = HtPrcNo;
};
setField('blocknum',Block);
//alarmnum
var alarmnum='';
for (let i = 0; i < (alarmcnt); i++){
if (alarm[i][2] === 1){
alarmnum += alarm[i][0] + ((i < alarmcnt-1) ? '|' : '');
}
}
if (alarmnum === ''){
alarmnum = 0;
}
setField('alarmnum', alarmnum);
}
熱処理装置サンプルスクリプト2
// グローバル変数
var Counter = 0;
var coilvolsum = 0;
var coilvolsum1 = 0;
var coilvolsum2 = 0;
var srcvolsum = 0;
var coilpowsum = 0;
var coilpowsum1 = 0;
var coilpowsum2 = 0;
var coilcursum = 0;
var coilcursum1 = 0;
var coilcursum2 = 0;
var stp_prev = 0;
var stat_val_prev = 0;
var interval = 100;
cycleOnprev = 1;
//BCD変換の関数定義
function toBCD(decimal) {
let str = decimal.toString(); // 文字列に変換
let bcd = '';
for (let i = 0; i < str.length; i++) {
let digit = parseInt(str[i], 10);
let bin = digit.toString(2).padStart(4, '0'); // 4ビットに揃える
bcd += bin + '';
}
return bcd.trim(); // 最後のスペースを削除
}
// 初期化関数 Logger起動後に1回だけ実行します。
function Initialize() {
}
// ロギング関数 Loggerのロギングの1サイクルごとに実行します。getPlcValue関数でPLC値を取得します。setFieldでロギングデータを設定します。
function Logging() {
// タグ設定
setField('datatag', 'KOMATSU');
// operatingStatus(D9031の0bitで判断)
var OnOffRaw = getPlcValue('D9031');
var OnOffBCD = toBCD(OnOffRaw);
// BCDの末尾1ビットを取得し、数値に変換
var OnOffBits = parseInt(OnOffBCD.charAt(OnOffBCD.length - 1), 2);
setField('script001', OnOffBits);
// ON/OFF状態に応じてサイクル状態を設定
var cycleOn = (OnOffBits === 1 ? 1 : 4);
setField('OperatingStatus', cycleOn);
// PartsSerialnumber
setField('partsserialnumber', getPlcValue('D9011'));
// BlockNumber(D9031が変化、または電圧・流量が閾値をまたぐと変化)
var vol = getPlcValue('D9044'); // 電圧
var wflow = getPlcValue('D9060'); // 流量
// processname
setField('processname','IQ');
// 状態値の計算
var stat_val = 10 * (vol > 10 ? 1 : 0) + (wflow > 900 ? 1 : 0);
var status = 10 * OnOffRaw;
var stp;
var block;
if (OnOffBits === 0) {
stp = 0;
} else {
if (stat_val_prev !== stat_val) {
stp = stp_prev + 1;
} else {
stp = stp_prev;
}
}
block = status + stp;
stp_prev = stp;
stat_val_prev = stat_val;
setField('BlockNum', block);
//data026コイル電流累計[Ah]
var coilcur = getPlcValue('D9048');
if (coilcur > 0){
coilcursum = coilcursum + coilcur * (interval/1000)/3600;
}else{
coilcursum = 0;
}
setField('Data026', coilcursum);
//data027コイル皮相電力累計[kVAh]
var coilpow = getPlcValue('D9049');
if (coilpow > 0){
coilpowsum = coilpowsum + coilpow * (interval/1000)/3600;
}else{
coilpowsum = 0;
}
setField('Data027', coilpowsum);
//data028D9047コイル電圧累計[Vh]
var coilvol = getPlcValue('D9047');
if (coilvol > 0){
coilvolsum = coilvolsum + coilvol * (interval/1000)/3600;
}else{
coilvolsum = 0;
}
setField('Data028', coilvolsum);
//data029D9044高周波電圧累計[Vh]
var srcvol = getPlcValue('D9044');
if (srcvol > 0){
srcvolsum = srcvolsum + srcvol * (interval/1000)/3600;
}else{
srcvolsum = 0;
}
setField('Data029', srcvolsum);
//data030 D9047 1次加熱コイル電圧累計,コイル電流累計、コイル電力累計
if (block === 25731){
coilvolsum1 = coilvolsum1 + (coilvol * (interval/1000))/3600;
coilcursum1 = coilcursum1 + (coilcur * (interval/1000))/3600;
coilpowsum1 = coilpowsum1 + (coilpow * (interval/1000))/3600;
}
//工程間停止はゼロ
if (cycleOnprev === 444){
coilvolsum1 = 0;
coilcursum1 = 0;
coilpowsum1 = 0;
}
setField('Data030', coilvolsum1);
setField('Data032', coilcursum1);
setField('Data034', coilpowsum1);
//data031 D9047 2次加熱コイル電圧累計,コイル電流累計,コイル電力累計
if (block === 25733){
coilvolsum2 = coilvolsum2 + (coilvol * (interval/1000))/3600;
coilcursum2 = coilcursum2 + (coilcur * (interval/1000))/3600;
coilpowsum2 = coilpowsum2 + (coilpow * (interval/1000))/3600;
}
//工程間停止はゼロ
if (cycleOnprev === 444){
coilvolsum2 = 0;
coilcursum2 = 0;
coilpowsum2 = 0;
}
setField('Data031', coilvolsum2);
setField('Data033', coilcursum2);
setField('Data035', coilpowsum2);
cycleOnprev = Math.trunc(cycleOnprev / 10) + (100 * cycleOn);
}
・スクリプトファイルの形式
①グローバル変数(任意)
サンプリング周期毎に初期化されると困る変数などの宣言領域として使用してください
②初期化(Initialize)関数
ロガーが起動した際に1回だけ実行される部分になります。初期値が必要な場合等に使用してください。
③ロギング(Logging)関数
スクリプトのメインになる部分です。この領域に設定したスクリプトがサンプリング周期毎に実行され、トレンドデータとして記録されます。

専用の関数としてPLCのデバイス値を取得するgetPlcValue()関数とロギングデータとして転送するsetField()関数を準備しています。
・getPlcValue()関数
getPlcValue(‘デバイスアドレス’)で指定したデバイスを読取ります。なおここで読取り可能なデバイスは、「PLCデータ設定2」のタブでPLC読込を設定したものに限定されます。
・setField()関数
setField(‘フィールド(カラム)名’, 書込む値)で指定フィールドに値を転送します。フィールド名は下図赤線部のように、ロガー画面の「PLC」タブに表示される項目の()内の値を入力してください。

データ取得確認 #
設定が終わったら正しくデータ取得ができているか確認します。ロガー画面でPLCのタブを選択し、データ取得画面を表示します。
①値
「値」列にはデータ取得設定、スクリプト実行結果の値がリアルタイム(1sec毎更新)に表示されます。正しい値を得られているか確認してください。
スクリプトを修正する場合はテキストエディタでスクリプトファイルを開き、修正を行ってください。スクリプトファイルを上書き保存し更新されると、変更結果がこの画面に即時反映されます。
②設備通信状況
PLCとの通信が正しくできている場合「設備通信可」が表示されます。通信エラーなどが発生した場合は「設備通信断」が表示されます。表示されたエラー内容に合わせて設定を修正してください。

エラー発生時の画面例
