どうやら三日坊主にはならなかったようです。12月連続記事企画、4日目の今日は「PHP + MX Component」という、一体誰がそんなことをするんだ!?という記事を書いてみたいと思います。

XAMPP

昨日も書きましたが、大事なことなのでもう一度書きます。今の私だったら Windows を Home から Pro にアップグレードして、IIS で Web 画面を作ります。その方が色々と上手くいきます。

とは言え、OS のアップグレードができない場合もあります。そんな時は XAMPP でしょう。XAMPP を使うと、PHP の動作環境をとても簡単に用意することができます。

PHP

PHP で MX Component を使って PLC のデータを読み込む、簡単なコードを以下に示します。

COM の操作は面倒なので、まずは適当なクラスを用意しましょう。

class ActMLEasyIf {
	const NO_ERROR = 0;
	private $com = FALSE;
	function __construct($stn) {
		$com = new COM('ActMulti.ActMLEasyIF');
		$com->ActLogicalStationNumber = new VARIANT(intval($stn));
		$err = $com->Open();
		if ($err != ActMLEasyIf::NO_ERROR) {
			throw new Exception('PLCに接続できませんでした');
		}
		$this->com = $com;
	}
	function __destruct() {
		if ($this->com != FALSE) $this->com->Close();
	}
	function read_data($addr, $len) {
		$v_buf = new VARIANT(array_fill(0, $len, FALSE), VT_ARRAY | VT_VARIANT);
		$v_addr = new VARIANT($addr);
		$v_len = new VARIANT($len)
		$err = $this->com->ReadDeviceBlock2($v_addr, $v_len, $v_buf);
		if ($err != ActMLEasyIf::NO_ERROR) {
			throw new Exception('データの読み出し中にエラーが発生しました');
		}
		$data = array();
		foreach($v_buf as $v_val) {
			$data[] = $v_val;
		}
		return $data;
	}
}

以下のコードで、論理局番 0 の PLC の、ZR1000 から100ワードのデータを読み出すことができます。

$plc = new ActMLEasyIf(0);
$data = $plc->read_data('ZR1000', 100)

書き方がわかれば簡単ですね。読み出したデータは整数の配列として扱うことができます。

制限事項

  • この記事で紹介しているコードは、説明のためにエラー処理を省略しています。実際にはもう少し真面目にエラー処理を実装する必要があります。
  • PLC との接続は、ページ毎に毎回切断してください。さもなくば、三菱電機の呪いがあなたに降りかかることでしょう。
  • 同時接続が発生する場合、接続毎に MX Component の論理局番を別にすると上手く動きます。

明日は JavaScript の記事を書いてみたいと思います。

この記事の投稿者

崎 洋佑
崎 洋佑
さきラボ代表の崎 (さき) です。主に経営、営業、開発を担当しています。
コンピューターよりも人が好きです。よく使う言語は日本語。プログラマーもどきです。