(57)【特許請求の範囲】
【請求項１】
ユーザプログラムをスキャン毎に繰り返し実行する基本ユニットと、前記基本ユニットに接続される拡張ユニットとを有するプログラマブル・ロジック・コントローラであって、
前記拡張ユニットは、
外部機器が接続されるインターフェースと、
前記インターフェースを介した前記外部機器からの入力値または前記インターフェースを介した前記外部機器への出力値に関するデバイス値が格納され、前記基本ユニットとデータ共有するための複数の第一デバイスが割り付けられた記憶部と、
クロックを計数して時間を計測する拡張ユニットタイマと、
を備え、
前記基本ユニットは、
クロックを計数して時間を計測する基本ユニットタイマと、
前記拡張ユニットタイマと前記基本ユニットタイマのタイマ値を同期させる同期手段と、
スキャン毎のリフレッシュの期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第１更新手段と、
前記同期手段により前記拡張ユニットタイマのタイマ値と同期した前記基本ユニットタイマのタイマ値に基づいてスキャン中に定周期で実行される処理の期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第２更新手段と、
を備え、
前記プログラマブル・ロジック・コントローラは、
前記複数の第一デバイスのうち前記ユーザプログラムに記述される一つの第一デバイスに対し、該一つの第一デバイスを更新する更新手段として、前記第１更新手段および前記第２更新手段のいずれか一方を選択する選択手段
を備え、
前記選択手段により前記第１更新手段が選択されている場合には、前記一つの第一デバイスは前記第１更新手段によって更新され、前記選択手段により前記第２更新手段が選択されている場合には、前記一つの第一デバイスは前記第２更新手段によって更新されることを特徴とするプログラマブル・ロジック・コントローラ。
【請求項２】
前記基本ユニットは、前記ユーザプログラムと、前記同期手段により同期させた前記基本ユニットタイマのタイマ値に基づいて実行されるユニット間同期プログラムとを記憶するプログラム記憶部を備え、
前記第２更新手段は、前記一つの第一デバイスが前記ユニット間同期プログラムに記述されているときに、前記拡張ユニットが前記一つの第一デバイスに保持しているデータと前記基本ユニットが保持しているデータとを一致させることを特徴とする請求項１に記載のプログラマブル・ロジック・コントローラ。
【請求項３】
前記第２更新手段は、前記スキャン中において前記ユーザプログラムが実行されている期間であっても、前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させることを特徴とする請求項１に記載のプログラマブル・ロジック・コントローラ。
【請求項４】
前記拡張ユニットタイマのタイマ値は、前記拡張ユニットの内部処理の開始タイミングとして使用され、
前記拡張ユニットの内部処理は、前記外部機器からの入力値に基づいて前記デバイス値を演算する処理または前記デバイス値から前記外部機器への出力値を演算する処理であることを特徴とする請求項１ないし３のいずれか１項に記載のプログラマブル・ロジック・コントローラ。
【請求項５】
前記第１更新手段は、前記同期手段によって前記拡張ユニットタイマのタイマ値と同期した前記基本ユニットタイマのタイマ値に基づくスキャン毎のリフレッシュの期間内で更新を実行することを特徴とする請求項１に記載のプログラマブル・ロジック・コントローラ。
【請求項６】
前記基本ユニットはそれぞれデータを保持する記憶領域である複数の第二デバイスを有し、
前記複数の第一デバイスおよび前記複数の第二デバイスは、前記拡張ユニットのデータを前記基本ユニットへ伝達するための入力デバイスと、前記基本ユニットのデータを前記拡張ユニットに伝達するための出力デバイスとを含み、
前記第１更新手段および前記第２更新手段は、前記拡張ユニットの前記第一デバイスのうち前記入力デバイスに記憶されているデータであるデバイス値を前記基本ユニットの前記第二デバイスのうち前記入力デバイスへコピーすることで前記入力デバイスのデータであるデバイス値を更新するとともに、前記基本ユニットの前記第二デバイスのうち前記出力デバイスに記憶されているデータであるデバイス値を前記拡張ユニットの前記第一デバイスである前記出力デバイスへコピーすることで前記出力デバイスのデータであるデバイス値を更新することを特徴とする請求項１ないし５のいずれか１項に記載のプログラマブル・ロジック・コントローラ。
【請求項７】
前記入力デバイスは前記拡張ユニットが有する機能の状態を表すデータを記憶し、
前記出力デバイスは前記拡張ユニットが有する機能を制御するデータを記憶することを特徴とする請求項６に記載のプログラマブル・ロジック・コントローラ。
【請求項８】
前記リフレッシュの期間において前記第１更新手段が前記出力デバイスに保持されているデータと前記入力デバイスに保持されているデータを更新し、前記基本ユニットタイマのタイマ値に基づいてスキャン中に定周期で実行される処理の期間において前記第２更新手段が前記拡張ユニットに保持されているデータと前記基本ユニットに保持されているデータとを更新することを特徴とする請求項６または７に記載のプログラマブル・ロジック・コントローラ。
【請求項９】
前記第２更新手段は、前記基本ユニットに設けられ、データを保持するメモリである第二デバイスと、前記拡張ユニットに設けられ、前記リフレッシュの対象とならないデータを保持するバッファメモリとの間でデータを一致させることを特徴とする請求項１ないし５のいずれか１項に記載のプログラマブル・ロジック・コントローラ。
【請求項１０】
前記選択手段は、前記第２更新手段による更新の対象となるデータを指定する更新対象指定情報を記憶する記憶手段を有し、
前記第２更新手段は、前記更新対象指定情報によって指定されたデータを更新し、
前記第１更新手段は、前記更新対象指定情報によって指定されていないデータを前記リフレッシュの期間で更新することを特徴とする請求項１に記載のプログラマブル・ロジック・コントローラ。
【請求項１１】
前記拡張ユニットは、前記第２更新手段における更新処理の遅延時間に応じて当該拡張ユニットで実行される内部処理の開始を遅延させることを特徴とする請求項１ないし１０のいずれか１項に記載のプログラマブル・ロジック・コントローラ。
【請求項１２】
前記拡張ユニットは、
前記第２更新手段によって更新される前記データを記憶する第１バッファと、
当該拡張ユニットの内部処理によって参照されるデータを記憶する第２バッファと、
前記同期手段が同期処理を実行するときに前記第１バッファに記憶されているデータと前記第２バッファに記憶されているデータとが一致するように更新する第３更新手段をさらに有し、
前記第２更新手段は、前記第３更新手段が更新処理を完了した後で、更新処理を実行することを特徴とする請求項１に記載のプログラマブル・ロジック・コントローラ。
【請求項１３】
プログラマブル・ロジック・コントローラの拡張ユニットに接続され、ユーザプログラムをスキャン毎に繰り返し実行する基本ユニットであって、
前記拡張ユニットは、
外部機器が接続されるインターフェースと、
前記インターフェースを介した前記外部機器からの入力値または前記インターフェースを介した前記外部機器への出力値に関するデバイス値が格納され、前記基本ユニットとデータ共有するための複数のデバイスが割り付けられた記憶部と、
クロックを計数して時間を計測する拡張ユニットタイマと、
を備えており、
前記基本ユニットは、
クロックを計数して時間を計測する基本ユニットタイマと、
前記拡張ユニットタイマと前記基本ユニットタイマのタイマ値を同期させる同期手段と、
スキャン毎のリフレッシュの期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第１更新手段と、
前記同期手段により前記拡張ユニットタイマのタイマ値と同期した前記基本ユニットタイマのタイマ値に基づいてスキャン中に定周期で実行される処理の期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第２更新手段と、
前記複数のデバイスのうち前記ユーザプログラムに記述される一つのデバイスに対し、該一つのデバイスを更新する更新手段として、前記第１更新手段および前記第２更新手段のいずれか一方を選択する選択手段と
を備え、
前記選択手段により前記第１更新手段が選択されている場合には、前記一つのデバイスは前記第１更新手段によって更新され、前記選択手段により前記第２更新手段が選択されている場合には、前記一つのデバイスは前記第２更新手段によって更新されることを特徴とする基本ユニット。
【請求項１４】
プログラマブル・ロジック・コントローラの拡張ユニットに接続され、ユーザプログラムをスキャン毎に繰り返し実行する基本ユニットの制御方法であって、
前記拡張ユニットは、
外部機器が接続されるインターフェースと、
前記インターフェースを介した前記外部機器からの入力値または前記インターフェースを介した前記外部機器への出力値に関するデバイス値が格納され、前記基本ユニットとデータ共有するための複数のデバイスが割り付けられた記憶部と、
クロックを計数して時間を計測する拡張ユニットタイマと、
を備えており、
前記制御方法は、
クロックを計数して時間を計測する基本ユニットタイマと、前記拡張ユニットタイマと前記基本ユニットタイマのタイマ値を同期させる同期工程と、
スキャン毎のリフレッシュの期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第１更新工程と、
前記同期工程により前記拡張ユニットタイマのタイマ値と同期した前記基本ユニットタイマのタイマ値に基づいてスキャン中に定周期で実行される処理の期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第２更新工程と、
前記複数のデバイスのうち前記ユーザプログラムに記述される一つのデバイスに対し、該一つのデバイスを更新する更新工程として、前記第１更新工程および前記第２更新工程のいずれか一方を選択する選択工程と
を有し、
前記選択工程において前記第１更新工程が選択されている場合には、前記一つのデバイスは前記第１更新工程において更新され、前記選択工程において前記第２更新工程が選択されている場合には、前記一つのデバイスは前記第２更新工程において更新されることを特徴とする基本ユニットの制御方法。
【請求項１５】
請求項１４に記載の制御方法の各工程をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブル・ロジック・コントローラ、基本ユニット、制御方法およびプログラムに関する。
【背景技術】
【０００２】
一般にプログラマブル・ロジック・コントローラ（ＰＬＣ）は基本ユニット（ＣＰＵユニットとも呼ぶ）と拡張ユニットを備えている（特許文献１）。基本ユニットと拡張ユニットは、通常のラダープログラムが実行されるタイミングと同期した、リフレッシュ期間と呼ばれる期間においてデータの交換（いわゆるリフレッシュ通信）を行う。
【０００３】
ところで、基本ユニットと拡張ユニットは、ユニット間同期処理によって相互に制御の同期をとることもできる。具体的には、１台又は複数台の拡張ユニットの内部処理と、基本ユニットにおける所定の処理（ラダー実行処理など）とを同期させて実行することもできる。
【０００４】
一般に、ユニット間同期処理において基本ユニットと拡張ユニットの間でデータ交換を行うためには、ユーザは別途、ユニット間同期用のラダープログラムの中に、ダイレクト通信の命令語を書き込まなければならない。ダイレクト通信の命令語とは、基本ユニットがその命令語を実行したタイミングで、基本ユニットと拡張ユニットの間でデータ交換される命令語である。このダイレクト通信の命令語があることで、毎スキャンで繰り返し実行されるリフレッシュ通信のタイミングを待たなくてもデータ交換されるため、ユニット間同期処理を用いた外部機器の高速制御などのメリットが得られる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１４−０５２６７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、ユニット間同期用のラダープログラム中にダイレクト通信の命令語を逐一記述することは、ユーザにとって煩雑な作業であり、手間が掛かるものである。例えば、ユニット間同期ではない、毎スキャンで繰り返し実行される通常のラダープログラム（いわゆる平場のラダープログラム）の記述の一部または全部をユニット間同期用のラダープログラムに流用する場合であっても、別途、ダイレクト通信の命令語を書き加えなければならず、結局のところ、プログラム変更の作業が必要になる。
【０００７】
そこで、毎スキャンで繰り返し実行されるリフレッシュ通信と同様に、ユニット間同期用のラダープログラムが実行されるタイミングと同期して、ユニット間同期の対象となっているデータを一括でデータ交換する方法（いわゆるユニット間同期リフレッシュ）が考えられる。このユニット間同期リフレッシュは、毎スキャン実行される通常のリフレッシュとは別概念のものであるため、ユニット間同期リフレッシュの対象となるデバイスとして、通常のリフレッシュの対象となるデバイスとは異なる専用デバイスが用意される。
【０００８】
しかし、基本ユニットと拡張ユニットとの間で共有すべきデータは数多く存在するため、ユニット間同期リフレッシュの期間でデータのすべてをユニット間で一致するように更新処理（リフレッシュ）を実行しようとすると、上述した専用デバイスを数多く用意しなければならない。その結果、専用デバイスを用いてユニット間同期用のラダープログラムを作成することは、ユーザにとって煩雑な作業であり、手間が掛かるものである。また、上述同様、平場のラダープログラムの記述の一部または全部をユニット間同期用のラダープログラムに流用する場合には、別途、通常のリフレッシュの対象となるデバイスを、ユニット間同期リフレッシュの対象となる専用デバイスに書き換えなければならず、この方法も結局のところ、プログラムの変更作業が必要になる。
【０００９】
また、ユニット間同期リフレッシュの対象となる専用デバイスの数が多い場合、ユニット間同期リフレッシュの期間が長くなってしまう。その結果、外部機器の高速制御などのユニット間同期処理のメリットが相殺されることになってしまう。もしこのようなデータの一部を、ユニット間同期リフレッシュの期間以外の期間で実行できるように選択できれば、リフレッシュ期間の増大を抑制できるであろう。そこで、本発明は、基本ユニットと拡張ユニットとの間で共有すべきデータの更新タイミングを選択可能なデバイスを用意することで、ユニット間同期処理のメリットが低下するのを防ぎながら、プログラムの変更作業の負担を軽減してユーザビリティを向上させることを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、たとえば、
ユーザプログラムをスキャン毎に繰り返し実行する基本ユニットと、前記基本ユニットに接続される拡張ユニットとを有するプログラマブル・ロジック・コントローラであって、
前記拡張ユニットは、
外部機器が接続されるインターフェースと、
前記インターフェースを介した前記外部機器からの入力値または前記インターフェースを介した前記外部機器への出力値に関するデバイス値が格納され、前記基本ユニットとデータ共有するための複数の第一デバイスが割り付けられた記憶部と、
クロックを計数して時間を計測する拡張ユニットタイマと、
を備え、
前記基本ユニットは、
クロックを計数して時間を計測する基本ユニットタイマと、
前記拡張ユニットタイマと前記基本ユニットタイマのタイマ値を同期させる同期手段と、
スキャン毎のリフレッシュの期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第１更新手段と、
前記同期手段により前記拡張ユニットタイマのタイマ値と同期した前記基本ユニットタイマのタイマ値に基づいてスキャン中に定周期で実行される処理の期間内で前記拡張ユニットが保持しているデータと前記基本ユニットが保持しているデータとを一致させる第２更新手段と、
を備え、
前記プログラマブル・ロジック・コントローラは、
前記複数の第一デバイスのうち前記ユーザプログラムに記述される一つの第一デバイスに対し、該一つの第一デバイスを更新する更新手段として、前記第１更新手段および前記第２更新手段のいずれか一方を選択する選択手段
を備え、
前記選択手段により前記第１更新手段が選択されている場合には、前記一つの第一デバイスは前記第１更新手段によって更新され、前記選択手段により前記第２更新手段が選択されている場合には、前記一つの第一デバイスは前記第２更新手段によって更新されることを特徴とするプログラマブル・ロジック・コントローラを提供する。
【発明の効果】
【００１１】
本発明によればユーザビリティを向上させることが可能になる。
【図面の簡単な説明】
【００１２】
【図１】ＰＬＣシステムの一例を示す図
【図２】ユーザプログラムの一例を示す図
【図３】プログラム作成支援装置の一例を示す図
【図４】ＰＬＣの一例を示す図
【図５】スキャンタイムを説明するための図
【図６】スキャンタイムと同期周期との関係を示す図
【図７】基本ユニットの機能を示す図
【図８】拡張ユニットの機能を示す図
【図９】プログラム作成支援装置の機能を示す図
【図１０】スキャンタイムにおけるユニット間同期とリフレッシュを含む処理を示すフローチャート
【図１１】拡張ユニットで実行される同期リフレッシュを示すフローチャート
【図１２】同期リフレッシュと内部処理との時間的な関係を示す図
【図１３】ダブルバッファ構成と複数の拡張ユニット間でのデータの送受信を示す図
【図１４】ユニット間同期のタイミングに沿って実行されるスキャン処理を示すフローチャート
【図１５】ユニット間同期のタイミングに沿って実行されるスキャン処理を示すフローチャート
【図１６】同期リフレッシュと一括リフレッシュとのいずれかを選択するためのＧＵＩの一例を示す図
【発明を実施するための形態】
【００１３】
以下に本発明の一実施形態を示す。以下で説明される個別の実施形態は、本発明の上位概念、中位概念および下位概念など種々の概念を理解するために役立つであろう。また、本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されるわけではない。
【００１４】
はじめにプログラマブル・ロジック・コントローラ（ＰＬＣ、単にプログラマブルコントローラと呼ばれてもよい）を当業者にとってよりよく理解できるようにするために、一般的なＰＬＣの構成とその動作について説明する。
【００１５】
図１は、本発明の実施の形態によるプログラマブル・ロジック・コントローラシステムの一構成例を示す概念図である。図１に示すように、このシステムは、ラダープログラムなどのユーザプログラムの編集を行うためのプログラム作成支援装置１と、工場等に設置される各種制御装置を統括的に制御するためのＰＬＣ（プログラマブル・ロジック・コントローラ）２とを備えている。ＰＬＣ２は、ＣＰＵが内蔵された基本ユニット３と１つないし複数の拡張ユニット４を備えている。基本ユニット３に対して１つないし複数の拡張ユニット４が着脱可能となっている。基本ユニット３はＣＰＵユニットと呼ばれることもある。
【００１６】
基本ユニット３には、表示部５及び操作部６が備えられている。表示部５には、基本ユニット３に取り付けられている各拡張ユニット４の動作状況などを表示することができ、表示部５の表示内容は、操作部６を操作することにより切り替えることができる。表示部５には、通常、ＰＬＣ２内のデバイスの現在値（デバイス値）やＰＬＣ２内で生じたエラー情報などが表示される。なお、デバイスとは、デバイス値を格納するために設けられたメモリ上の領域を指す名称であり、デバイスメモリと呼ばれてもよい。デバイス値とは、入力機器からの入力状態、出力機器への出力状態およびユーザプログラム上で設定される内部リレー（補助リレー）、タイマ、カウンタ、データメモリ等の状態を示す情報である。
【００１７】
拡張ユニット４は、ＰＬＣ２の機能を拡張するために用意されており、基本ユニット３に対して側方から取り付けられる。１つ目の拡張ユニット４は、基本ユニット３に対して側方から直接的に取り付けられる。２つ目以降の拡張ユニット４は、既に取り付けられている拡張ユニット４に対して、側方から直列的に取り付けられる。たとえば、基本ユニット３の右側面と拡張ユニット４の左側面とが連結面になっている。同様に、１つ目の拡張ユニット４の右側面の形状等は基本ユニット３の右側面とほぼ同じであるため、１つ目の拡張ユニット４の右側面に２つ目の拡張ユニット４の左側面が連結される。このような連結方式は、数珠つなぎ方式とかデイジーチェーン方式と呼ばれてもよい。各連結面にはコネクタが設けられており、通信や電力供給を行うためのバスもコネクタを介して連結される。このようにして、基本ユニット３と複数の拡張ユニット４が直列的に取り付けられると、各拡張ユニット４内に備えられた配線（例：バス）を介して、各拡張ユニット４が基本ユニット３に対して通信可能に接続される。各拡張ユニット４には、その拡張ユニット４の機能に対応する被制御装置１６（図４）が接続され、これにより、各被制御装置１６が拡張ユニット４を介して基本ユニット３に接続される。被制御装置１６には、センサなどの入力装置や、アクチュエータなどの出力装置が含まれる。
【００１８】
プログラム作成支援装置１は、たとえば、携帯可能ないわゆるノートタイプやタブレットタイプのパーソナルコンピュータであって、表示部７及び操作部８を備えている。ＰＬＣ２を制御するためのユーザプログラムの一例であるラダープログラムは、プログラム作成支援装置１を用いて作成され、その作成されたラダープログラムは、プログラム作成支援装置１内でニモニックコードに変換される。そして、プログラム作成支援装置１を、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）などの通信ケーブル９を介してＰＬＣ２の基本ユニット３に接続し、ニモニックコードに変換されたラダープログラムをプログラム作成支援装置１から基本ユニット３に送ると、そのラダープログラムが基本ユニット３内でマシンコードに変換され、基本ユニット３に備えられたメモリ内に記憶される。
【００１９】
なお、図１では示していないが、プログラム作成支援装置１の操作部８には、プログラム作成支援装置１に接続されたマウスなどのポインティングデバイスが含まれていてもよい。また、プログラム作成支援装置１は、ＵＳＢ以外の他の通信ケーブル９を介して、ＰＬＣ２の基本ユニット３に対して着脱可能に接続されるような構成であってもよい。
【００２０】
図２は、ラダープログラムの作成時にプログラム作成支援装置１の表示部７に表示されるラダー図１７の一例を示す図である。図２に示すように、ＰＬＣ２を制御するためのラダープログラムは、プログラム作成支援装置１の表示部７にマトリックス状に表示される複数のセル１８内に仮想デバイスのシンボル１９を適宜配置して、視覚的なリレー回路を表すラダー図１７を構築することにより作成される。
【００２１】
ラダー図１７には、たとえば、１０列×Ｎ行（Ｎは任意の自然数）のセル１８が配置されている。そして、各行のセル１８内に、図２に示す左側から右側に向かって、時系列的に仮想デバイスのシンボル１９を適宜配置することにより、視覚的なリレー回路を作成することができる。作成されるリレー回路は、１行で表される直列的なリレー回路であってもよいし、複数行に並列的に表されたリレー回路を互いに結合することにより作成された、並列的なリレー回路であってもよい。
【００２２】
図２に示すリレー回路は、入力装置からの入力信号に基づいてオン／オフされる３つの仮想デバイス（以下、「入力デバイス」と呼ぶ。）のシンボル１９ａ，１９ｂ，１９ｃと、出力装置の動作を制御するためにオン／オフされる仮想デバイス（以下、「出力デバイス」と呼ぶ。）のシンボル１９ｄとが適宜結合されることにより構成されている。
【００２３】
各入力デバイスのシンボル１９ａ，１９ｂ，１９ｃの上方に表示されている文字（「Ｒ０００１」、「Ｒ０００２」及び「Ｒ０００３」）は、その入力デバイスのデバイス名（アドレス名）２１を表している。各入力デバイスのシンボル１９ａ，１９ｂ，１９ｃの下方に表示されている文字（「フラグ１」、「フラグ２」及び「フラグ３」）は、その入力デバイスに対応付けられたデバイスコメント２２を表している。出力デバイスのシンボル１９ｄの上方に表示されている文字（「原点復帰」）は、その出力デバイスの機能を表す文字列からなるラベル２３である。
【００２４】
図２に示す例では、デバイス名「Ｒ０００１」及び「Ｒ０００２」にそれぞれ対応する２つの入力デバイスのシンボル１９ａ，１９ｂが直列的に結合されることにより、ＡＮＤ回路が構成されている。また、これらの２つの入力デバイスのシンボル１９ａ，１９ｂからなるＡＮＤ回路に対して、デバイス名「Ｒ０００３」に対応する入力デバイスのシンボル１９ｃが並列的に結合されることにより、ＯＲ回路が構成されている。すなわち、このリレー回路では、２つのシンボル１９ａ，１９ｂに対応する入力デバイスがいずれもオンした場合、又は、シンボル１９ｃに対応する入力デバイスがオンした場合にのみ、シンボル１９ｄに対応する出力デバイスがオンされるようになっている。
【００２５】
図３は、図１のプログラム作成支援装置１の電気的構成について説明するためのブロック図である。図３に示すように、プログラム作成支援装置１には、ＣＰＵ２４、表示部７、操作部８、記憶装置２５及び通信部２６が備えられている。表示部７、操作部８、記憶装置２５及び通信部２６は、それぞれＣＰＵ２４に対して電気的に接続されている。記憶装置２５は、少なくともＲＡＭを含む構成であり、ラダープログラム記憶部２５ａと、編集ソフト記憶部２５ｂとを備えている。
【００２６】
ユーザは、編集ソフト記憶部２５ｂに記憶されている編集ソフトをＣＰＵ２４に実行させて、操作部８を通じてラダープログラムを編集する。ここで、ラダープログラムの編集には、ラダープログラムの作成及び変更が含まれる。編集ソフトを用いて作成されたラダープログラムは、ラダープログラム記憶部２５ａに記憶される。また、ユーザは、必要に応じてラダープログラム記憶部２５ａに記憶されているラダープログラムを読み出し、そのラダープログラムを、編集ソフトを用いて変更することができる。通信部２６は、通信ケーブル９を介してプログラム作成支援装置１を基本ユニット３に通信可能に接続するためのものである。
【００２７】
図４は、ＰＬＣ２の電気的構成について説明するためのブロック図である。図４に示すように、基本ユニット３には、ＣＰＵ１０、表示部５、操作部６、記憶装置１２及び通信部１４が備えられている。表示部５、操作部６、記憶装置１２、及び通信部１４は、それぞれＣＰＵ１０に電気的に接続されている。記憶装置１２は、ＲＡＭやＲＯＭ、メモリカードなどを含んでもよく、ラダープログラムなどを記憶する。記憶装置１２には、プログラム作成支援装置１から入力されたラダープログラムやユーザデータが上書きして記憶される。また、記憶装置１２には基本ユニット用の制御プログラムも格納されている。
【００２８】
図５は、本発明の実施の形態に係るプログラマブルコントローラの基本ユニット３でのスキャンタイムの構成を示す模式図である。図５が示すように１つのスキャンタイムＴは、入出力のリフレッシュを行うためのユニット間通信２０１、プログラム実行２０２、ＥＮＤ処理２０４により構成されている。ユニット間通信２０１で、基本ユニット３は、ラダープログラムを実行して得られた出力データを基本ユニット３内の記憶装置１２から外部機器などに送信するとともに、受信データを含めた入力データを基本ユニット３内の記憶装置１２に取り込む。たとえば、基本ユニット３のデバイスに記憶されているデバイス値はリフレッシュによって拡張ユニット４のデバイスに反映される。同様に、拡張ユニット４のデバイスに記憶されているデバイス値はリフレッシュによって基本ユニット３のデバイスに反映される。なお、リフレッシュ以外のタイミングでデバイス値をユニット間で更新する仕組みが採用されてもよい。ただし、基本ユニット３のデバイスは基本ユニット３が随時書き換えており、同様に、拡張ユニット４のデバイスは拡張ユニット４が随時書き換えている。つまり、基本ユニット３のデバイスは基本ユニット３の内部の装置によって随時アクセス可能であり、同様に、拡張ユニット４のデバイスは拡張ユニット４の内部の装置によって随時アクセス可能になっている。基本ユニット３と拡張ユニット４との間では基本的にリフレッシュのタイミングにおいて相互にデバイス値を更新して同期する。プログラム実行２０２で、基本ユニット３は、更新された入力データを用いてプログラムを実行（演算）する。基本ユニット３はプログラムの実行によりデータを演算処理する。なお、ＥＮＤ処理とは、プログラム作成支援装置１や基本ユニット３に接続された表示器（図示せず）等の外部機器とのデータ通信、システムのエラーチェック等の周辺サービスに関する処理全般を意味する。ＥＮＤ処理は周辺処理と呼ばれることもある。
【００２９】
このように、プログラム作成支援装置１はユーザの操作に応じたラダープログラムを作成し、作成したラダープログラムをＰＬＣ２に転送する。ＰＬＣ２は、入出力リフレッシュ、ラダープログラムの実行およびＥＮＤ処理を１サイクル（１スキャン）として、このサイクルを周期的、すなわちサイクリックに繰り返し実行する。これにより、各種入力機器（センサ等）からのタイミング信号に基づいて、各種出力機器（モータ等）を制御する。よって、ＰＬＣ２は汎用のパーソナルコンピュータ（ＰＣ）とは全く異なる動きをする。
【００３０】
＜ユニット間同期＞
ユニット間同期とは、基本ユニット３の内部処理の制御周期と拡張ユニット４の内部処理の制御周期とを同期させる処理のことである。基本ユニット３と拡張ユニット４はそれぞれタイマを有し、タイマ値に応じて内部処理の開始タイミングなどを決定する。基本ユニット３と拡張ユニット４が同じ周期のタイマを有することにより、両者の制御周期が同期する。なお、基本ユニット３の制御周期を基準として拡張ユニット４の制御周期を同期させる方法と、拡張ユニット４の制御周期を基準として基本ユニット３の制御周期を同期させる方法とがある。いずれにしても拡張ユニット４は、拡張ユニット４の制御周期にしたがって内部処理を実行する。つまり、内部処理の開始タイミングは拡張ユニット４の制御周期の開始タイミングに一致している。なお、同期処理はユーザプログラムであるラダープログラムのスキャンタイム内における特定の期間に実行されてもよいし、ラダープログラムに対して割り込むことで実行されてもよい。ここでは説明の便宜上、一定周期の割り込みによってユニット間同期が実行されるものとして説明する。割り込みを実行するための割り込みモジュールが基本ユニット３に設けられていてもよい。たとえば、図６（Ａ）が示すように、スキャンタイムが５ミリ秒だとすると、ユニット間同期の同期周期は２００マイクロ秒（ｕｓ）に設定されることがある。この場合は、１つのスキャンタイム内で２５回のユニット間同期が実行されることになる。なお、スキャンはスキャンモジュールによって制御されており、これとは並行してユニット間同期は同期モジュールによって実行されている。そのため、リフレッシュの期間（ユニット間通信２０１）、ラダープログラムを実行している期間（プログラム実行２０２）、ＥＮＤ処理を実行している期間（ＥＮＤ処理２０４）のいずれにおいてもユニット間同期が定周期で実行される。
【００３１】
上述した内部処理は内部機能が実行する処理のことである。拡張ユニット４はインターフェースを備え、当該インターフェースを介して外部機器である被制御装置１６と接続されている。拡張ユニット４は外部機器から取得したデータに対して演算を実行して入力デバイス値を求め、入力デバイスに格納する。また、拡張ユニット４は出力デバイスのデバイス値に対して演算を実行して出力値を求め、外部機器に出力する。内部処理とはこれらの演算処理などである。なお、演算処理は、数式に基づく算出処理だけでなく、テーブルから値を取得するような処理も含まれる概念である。
【００３２】
＜一括リフレッシュと同期リフレッシュ＞
図５に示したように入出力リフレッシュは１つのスキャンタイムＴにおいて一回だけ実行される（これを一括リフレッシュと呼ぶことにする。）。しかし、１つのスキャンタイムにおいて一回だけのリフレッシュを行うだけでは、十分ではないようなデータも存在する。このようなデータについてはデバイスに割り付けずに、バッファメモリに割り付け、バッファメモリに対してダイレクト通信を行うことで、データを読み書きすることが可能となる。しかし、この場合は、ラダープログラム内でダイレクト通信を実行するための命令を記述しておかなければならない。スキャンタイム（例：５ｍｓ）に対してずっと短い周期（例：２００ｕｓ）で更新される必要があるデータについてはラダープログラム内の多数の個所にデータの更新命令を記述しておかねばならず、ユーザビリティにかける面があった。また、「発明が解決しようとする課題」の欄に記述したような問題があった。
【００３３】
ところで、上述したようにユニット間同期（ユニット間同期プログラム）は非常に短い同期周期で繰り返し実行されるように設定されることがある。よって、図６（Ｂ）が示すように、ユニット間同期の際にデータをリフレッシュすれば、リアルタイム性の要求されるデータをフレッシュな状態に維持できるようになろう（これを同期リフレッシュと呼ぶことにする）。しかし、一括リフレッシュの対象となっていたすべてのデバイスについて同期リフレッシュを実行してしまうと、ユニット間同期に付随した同期リフレッシュによって平場のラダープログラムが中断される時間が長くなり（別の言い方をすると、同期リフレシュに伴って実行されるユニット間同期プログラムの記述量が制限されることになり）、基本ユニット３が拡張ユニット４を制御する上で不都合が生じる。これは、基本ユニット３がユニット間同期のタイミングでラダープログラムに対して割り込みを発生させ、同期リフレッシュを実行する必要があるからである。なお、リフレッシュの期間（ユニット間通信２０１）、ラダープログラムを実行している期間（プログラム実行２０２）、ＥＮＤ処理を実行している期間（ＥＮＤ処理２０４）のいずれにおいてもユニット間リフレッシュが定周期の割り込みで実行される。基本ユニット３に対して多数の拡張ユニット４が接続されていれば、その接続台数に概ね比例してリフレッシュ対象のデバイスの数も増加するため、中断時間も増加する。
【００３４】
そこで、複数あるデバイスをそれぞれ一括リフレッシュの対象とするか、同期リフレッシュの対象とするかを選択できれば、ラダープログラムが中断される時間を削減できるであろう。つまり、基本ユニット３と拡張ユニット４との間で共有すべきデータの更新タイミングを選択可能とすれば、ユーザは自己が共用する範囲の中断時間に収まるように各デバイスについて更新タイミングを選択できるようになり、ユーザビリティが向上することになろう。なお、一部のデバイスは一括リフレッシュの対象として設定可能とされるだけでなく、同期リフレッシュの対象として設定可能であってもよい。
【００３５】
なお、これまでユーザプログラムであるラダープログラム内でダイレクト通信によって更新されていたようなバッファメモリについても同期リフレッシュの対象とされてもよい。つまり、同期リフレッシュの対象として選択されたバッファメモリについては、ラダープログラム内ではダイレクト通信のコードを記述する必要がなくなる。つまり、同期リフレッシュの対象として選択されたバッファメモリについては一括リフレッシュの対象とされているデバイスと同様にラダープログラム内で扱うことが可能となる。ラダープログラムの作成が容易になる点でもユーザビリティが向上しよう。また、ラダープログラム内でダイレクト通信により更新されていたデバイスについても同様に同期リフレッシュの対象として選択することが可能となる。
【００３６】
＜基本ユニットの機能＞
図７は基本ユニット３の機能の一例を示すブロック図である。ＣＰＵ１０は制御プログラム７７を実行することで様々な機能を実現する。なお、機能の一部はＡＳＩＣなどの論理回路によって実装されてもよい。
【００３７】
基本ユニット制御部７０は基本ユニット３の各部を統括的に制御する機能である。たとえば、基本ユニット制御部７０はスキャンの管理やユニット間リフレッシュなどのための割り込みの管理などを実行する。基本ユニット制御部７０はＣＰＵ１０が制御プログラム７７を実行することで実現される機能である。プログラム実行部７１は、主にラダープログラム７８などを実行する機能である。プログラム実行部７１はＡＳＩＣなどにより実装されると、制御の高速化を実現しやすい。デバイス制御部７２は、デバイス８０に対する読み書きを制御する機能である。デバイス制御部７２は、たとえば、同期リフレッシュが実行されている間は、デバイス８０の内容が他の手段によって書き換えられたり、読み出されたりしないように、排他・調停処理（禁止処理）を実行する。デバイス制御部７２は、第２更新部７６が同期リフレッシュを実行している間は、第２更新部７６以外の手段による割り込みを禁止してもよい。なお、同期リフレッシュを開始したときにすでに発生している割り込みについては禁止されずに、そのまま実行される。
【００３８】
ユニット間同期部７３は、予め定められた同期周期にしたがってユニット間同期プログラムを実行する。ユニット間同期プログラムは、平場のラダープログラムに対して割り込みをかけて実行されるプログラムであり、基本的に平場のラダープログラムよりも短い周期で実行される。ユニット間同期部７３は、拡張ユニットタイマ１１９（図８）のタイマ値と基本ユニットタイマ８８のタイマ値とを同期させるタイマ同期を実行する。タイマ同期を実行する機能はタイマ同期部としてユニット間同期部７３から独立して設けられていてもよい。これは拡張ユニット４に関しても同様である。タイマ同期の周期はたとえば１０００マイクロ秒などである。これにより、基本ユニット３の制御周期に対して拡張ユニット４の制御周期が同期する。一般に、ユニット間同期が実行されない場合、基本ユニット３の制御周期と拡張ユニット４の制御周期が徐々にずれて行き、基本ユニット３が拡張ユニット４を精度よく制御できなくなることがある。そのため、ユニット間同期プログラムを実行することで、基本ユニット３の制御周期と拡張ユニット４の制御周期が位相レベルで一致するようになる。基本ユニットタイマ８８はクロックを計数して時間を計測するタイマまたはカウンタである。ユニット間同期部７３は、基本ユニットタイマ８８のタイマ値を基準とした同期周期にしたがってユニット間同期プログラムを実行する。ユニット間同期部７３は、通信部１４に接続された拡張バスを介して拡張ユニット４に対して同期タイミングを通知するための同期信号を送信する。通信部１４には拡張バスによる通信を行うための通信機能やプログラム作成支援装置１と通信するための通信機能とが含まれているものとする。
【００３９】
更新部７４は、基本ユニット３がデバイスに記憶しているデータと拡張ユニット４がデバイスに記憶しているデータとが一致するように相互に更新する機能である。たとえば、基本ユニット３から拡張ユニット４に転送されるデータは出力デバイスに格納される。拡張ユニット４から基本ユニット３に転送されるデータは入力デバイスに格納される。一般に、複数の出力デバイスはまとめて出力リフレッシュによって更新され、複数の入力デバイスはまとめて入力リフレッシュによって更新される。入力リフレッシュと出力リフレッシュは一括リフレッシュと同期リフレッシュの双方に存在する。第１更新部７５は一括リフレッシュを実行する機能である。つまり、第１更新部７５はスキャン毎のリフレッシュの期間内で拡張ユニット４が保持しているデータと基本ユニット３が保持しているデータとを一致させる。第２更新部７６は同期リフレッシュを実行する機能である。つまり、第２更新部７６はユニット間同期部７３により拡張ユニットタイマ１１９のタイマ値と同期した基本ユニットタイマ８８のタイマ値に基づいてスキャン中に定周期で実行される処理の期間内で拡張ユニット４が保持しているデータと基本ユニット３が保持しているデータとを一致させる。なお第２更新部７６はスキャンタイム内のいずれの期間であっても割り込んで同期リフレッシュを実行しうる。
【００４０】
ユーザプログラムであるラダープログラム７８に記述される拡張ユニット４のデバイスは、第１更新部７５による更新の対象と第２更新部７６による更新の対象とのうち少なくともいずれかの更新対象として設定可能に構成される。基本ユニット制御部７０は、第１更新部７５による更新の対象となるデータ／デバイスや第２更新部７６による更新の対象となるデータ／デバイスを選択する選択手段として機能してもよい。つまり、基本ユニット制御部７０はデバイスを更新する更新手段として、第１更新部７５および第２更新部７６のうち少なくとも一方を選択する選択手段として機能してもよい。たとえば、基本ユニット制御部７０は、操作部６からの指示にしたがって各デバイスを一括リフレッシュの対象とするか、それとも同期リフレッシュの対象とするかを選択し、選択結果を設定データ７９に保持する。つまり、設定データ７９には、同期リフレッシュの対象となるデバイスやバッファメモリを指定する更新対象指定情報が含まれる。なお、一括リフレッシュの対象となるデバイスやバッファメモリについても更新対象指定情報として設定データ７９に含まれてもよい。なお、プログラム作成支援装置１においてこのような設定データ７９が作成され、ラダープログラム７８とともに基本ユニット３に転送されてきてもよい。なお、同期リフレッシュの対象だけが選択可能とされ、一括リフレッシュの対象は選択不可能にされてもよい。また、一括リフレッシュの対象だけが選択可能とされ、同期リフレッシュの対象は選択不可能にされてもよい。
【００４１】
記憶装置１２には制御プログラム７７が記憶されている。制御プログラム７７にはスキャンを実行するスキャンプログラムやユニット間同期を実行するユニット間同期プログラム、割り込みを実行する割り込みモジュールなどが含まれている。なお、ユニット間同期プログラムは、ユニット間同期処理によって拡張ユニットタイマ１１９（図８）のタイマ値と同期した基本ユニットタイマ８８のタイマ値に基づいて実行される。記憶装置１２はプログラム記憶部としても機能する。スキャンとはスキャンタイム内でユーザプログラムとＥＮＤ処理とを周期的に繰り返し実行させることをいう。ＥＮＤ処理には一括リフレッシュと周辺処理とが含まれる。スキャンタイムＴはスキャンに要する時間であり、一定に設定されるケースと可変とされるケースがあるが、本実施形態ではそのどちらのケースにも適用可能である。
【００４２】
スキャン制御プログラムや同期プログラムもラダー言語により記述されていてもよい。ユーザプログラムの一種であるラダープログラム７８はラダー言語により記述され、基本ユニット３の内部機能や拡張ユニット４の内部機能を制御するためのユーザプログラムである。設定データ７９には基本ユニット３や拡張ユニット４の接続順序や内部機能を制御するために必要となるパラメータなどが含まれている。デバイス８０は、たとえば、拡張ユニット４の内部機能に割り付けられたデータを機能する記憶領域であり、デバイスメモリと呼ばれることもある。ここではデバイス８０は複数のデバイスの集合として記載されている。第１デバイス８１は一括リフレッシュの対象として選択されているデバイスである。第２デバイス８２は同期リフレッシュの対象として選択されているデバイスである。第１デバイス８１の数は一般に第２デバイス８２の数よりも多いが、これは逆であってもよい。第３デバイス８３は、オプションであり、拡張ユニット４のバッファメモリＵＧに割り付けられたデバイスメモリである。第３デバイス８３については、第１更新部７５が一括リフレッシュしてもよいし、第２更新部７６が同期リフレッシュしてもよい。第３デバイス８３とバッファメモリＵＧの割り付け関係や、どちらのリフレッシュが適用されるかを示す情報についても設定データ７９に保持されている。複数の第３デバイス８３が設けられていてもよい。どちらのリフレッシュが適用されるかに応じて、更新部７４では、第３デバイス８３が第１デバイス８１として扱われたり、第２デバイス８２として扱われたりすることになる。
【００４３】
＜拡張ユニットの機能＞
図８は拡張ユニットの機能の一例を示すブロック図である。ＣＰＵ１１０は記憶装置１１１に記憶されているシステムプログラム１１７を実行することで様々な機能を実現する。拡張ユニット制御部１１３は、第１デバイス１１８や第２デバイス１２０に書き込まれる基本ユニット３からの指示に応じて被制御装置１６を制御する機能である。記憶装置１１１は、ＲＯＭやＲＡＭなどを有し、記憶装置１１１における一部のメモリは書き換え可能な不揮発性メモリであってもよい。ＣＰＵ１１０は被制御装置１６と通信するためのインターフェース１２３を有している。ユニット間同期部１１４は、拡張バスおよび通信部１１２を介して基本ユニット３から送信される同期信号にしたがって拡張ユニット４における内部処理の制御周期を基本ユニット３の制御周期に同期させるものでる。拡張ユニットタイマ１１９はクロックを計数して時間を計測するタイマまたはカウンタである。ユニット間同期部１１４は、拡張ユニットタイマ１１９のタイマ値を基本ユニットタイマ８８のタイマ値に一致させるように動作してもよい。なお、ユニット間同期部１１４は、第２更新部７６における更新処理の遅延時間に応じて拡張ユニット４で実行される内部処理の開始を遅延（延期）させる延期部１１５を備えていてもよい。更新処理が完了していないにもかかわらず、拡張ユニット４が内部処理を開始してしまうと、最新のデバイス値が内部処理に反映されなくなってしまう。そこで、更新処理が完了するまで内部処理の開始タイミングを延期することで、内部処理は最新のデバイス値を利用できるようになる。
【００４４】
記憶装置１１１にはデバイス値を格納するデバイスやダイレクト通信の対象となるバッファなどの記憶領域が確保される。第１デバイス１１８は、一括リフレッシュされるデバイスである。第１デバイス１１８のデバイス値は、基本ユニット３の第１デバイス８１と一致するデバイス値が格納される。第２デバイス１２０は、同期リフレッシュされるデバイスである。第２デバイス１２０のデバイス値は、基本ユニット３の第２デバイス８２と一致するデバイス値が格納される。なお、第１デバイス８１や第２デバイス１２０は複数のバッファにより実現されてもよい。第１バッファ１２１は、基本ユニット３とデバイス値を交換するためのバッファである。第２バッファ１２２は、拡張ユニット制御部１１３がデバイス値を入力したり、出力したりするためのバッファである。バッファ更新部１１６はオプションのユニットであり、１つのデバイスを複数のバッファにより実現するときに必要となる。第２デバイス１２０が出力デバイスである場合、バッファ更新部１１６は、基本ユニット３の第２デバイス８２のデバイス値を第１バッファ１２１に格納し、第１バッファ１２１に格納されたデバイス値をさらに第２バッファ１２２に格納する。第２デバイス１２０が入力デバイスである場合、バッファ更新部１１６は、内部処理の結果であるデバイス値を第２バッファ１２２に格納し、第２バッファ１２２に格納されたデバイス値を第１バッファ１２１に格納し、第１バッファ１２１に格納されたデバイス値を基本ユニット３の第２デバイス８２に転送する。このように第１バッファ１２１は同期リフレッシュの際に参照され、第２バッファ１２１は拡張ユニット４の内部処理によって参照される。このようなダブルバッファ構成を採用することで、第２デバイス１２０のデバイス値が確定してから、リフレッシュや内部処理に利用されるようになる。つまり、リフレッシュの途中でデバイス値が書き換えられてしまったり、内部処理の途中でデバイス値が書き換えられてしまったりすることが起きにくくなる。デバイス値には、一緒のタイミングで更新される必要がある複数のデバイス値の集合や（同時性）、更新の順序が決まっている複数のデバイス値の集合が存在する（順序性）。また、基本ユニット３と拡張ユニット４との間での伝達遅延時間がそれぞれほぼ同じになることを要求される複数のデバイス値の集合も存在する（伝達遅延時間の一定性）。たとえば、１つ目のデバイスには分母が格納され、２つ目のデバイスには分子が格納されており、この分母と分子とによって制御値が決定されることがある。このような制御値において、拡張ユニット制御部１１３が分母を取得した後で、分子が同期リフレッシュによって書き換えられてしまうと、分母と分子のペアが破たんし（いわゆる泣き別れ現象）、制御値が異常となる。よって、分母と分子のペアのように同時性を要求されるデバイスに関してはダブルバッファ構成が有効である。バッファ更新部１１６は、同時性を要求される複数のデバイス値が揃った後で第１バッファ１２１から第２バッファ１２２へ、または、第２バッファ１２２から第１バッファ１２１へバッファ更新を行うことで、複数のデバイス値の泣き別れを抑制できるようになる。なお、ダブルバッファ構成は順序性や伝達遅延時間の一定性を確保するためにも役立つ。バッファメモリＵＧは、通常はダイレクト通信によってアクセスされるメモリである。本実施形態では、複数のバッファメモリＵＧの１つ以上について第３デバイス８３に割り付けられうる。第３デバイス８３に割り付けられたバッファメモリＵＧは一括リフレッシュされたり、同期リフレッシュされたりするため、ダイレクト通信による更新が不要となる。
【００４５】
＜プログラム作成支援装置の機能＞
図９はプログラム作成支援装置１のＣＰＵ２４が編集ソフトウエア８６を実行することで実現する機能を示している。編集ソフトウエア８６は、ラダープログラム７８や設定データ７９などをユーザが編集するために使用するプログラムである。
【００４６】
ＣＰＵ２４は編集ソフトウエア８６を実行することで様々な手段として機能するが、ここでは代表的なものについて説明する。ラダープログラム作成部８７は表示部７にラダープログラム７８を作成および編集するためのユーザインタフェースを表示し、操作部８から入力される指示にしたがってラダープログラム７８を作成し、記憶装置２５に書き込む。設定データ作成部８４は、設定データ７９を作成するためのユーザインタフェースを表示部７に表示し、操作部８から入力される指示にしたがって設定データ７９を作成し、記憶装置２５に書き込む。たとえば、設定データ作成部８４は、基本ユニット３に接続される複数の拡張ユニット４のデバイスを列挙したリストを表示部７に表示し、デバイスごとに一括リフレッシュの対象とするか、同期リフレッシュの対象となるかを選択する。なお、１つの拡張ユニット４あたりのデバイスの数が少ない場合、設定データ作成部８４は、拡張ユニット４を単位として、一括リフレッシュの対象とするか、同期リフレッシュの対象となるかを選択してもよい。たとえば、設定データ作成部８４は、基本ユニット３に接続される複数の拡張ユニット４を列挙したリストを表示部７に表示し、拡張ユニット４ごとに一括リフレッシュの対象とするか、同期リフレッシュの対象となるかを選択する。このように設定データ７９には、各デバイスごとに一括リフレッシュの対象とするか、同期リフレッシュの対象となるかを示す情報が含まれていてもよい。プロジェクト転送部８５は、ラダープログラム７８および設定データ７９などをプロジェクトデータとしてまとめ、通信部２６を介して基本ユニット３に転送する。通信部２６は、基本ユニット３と通信するためのＵＳＢインターフェースやＬＡＮインターフェースを有している。
【００４７】
＜フローチャート＞
図１０は基本ユニット３が実行する処理を示すフローチャートである。基本ユニット３がメンテナンスモード（プログラミングモード）からランモードに切り替えられると、ＣＰＵ１０は制御プログラム７７にしたがって本フローチャートに係る処理を実行する。なお、本実施形態ではランモードにおいてユニット間同期処理が実行されるが、メンテナンスモードにおいてもユニット間同期処理が実行されるようにしてもよい。
【００４８】
Ｓ１でＣＰＵ１０（第１更新部７５）は一括リフレッシュを実行する。たとえば、第１更新部７５は複数あるデバイスのうち設定データ７９によって一括リフレッシュの対象として選択されているデバイスについて一括リフレッシュを実行する。
【００４９】
Ｓ２でＣＰＵ１０（プログラム実行部７１）はユーザプログラムであるラダープログラム７８を開始する。以降、プログラム実行部７１は、ラダープログラム７８が終了するまで、制御プログラム７７と並列にラダープログラム７８を実行する。
【００５０】
Ｓ３でＣＰＵ１０（ユニット間同期部７３）はユニット間同期をトリガーするイベントが発生したかどうかを判定する。このイベントは割り込みモジュール（ユニット間同期部７３または基本ユニット制御部７０）などによって所定期間ごとに発生するものとする。たとえば、ユニット間同期部７３は基本ユニットタイマ８８のタイマ値が所定値増えるごとにユニット間同期を実行してもよい。ユニット間同期の通知は信号線などを通じて拡張ユニット４にも発生する。ユニット間同期のイベントが発生するとＳ４に進む。ユニット間同期のイベントが発生していなければ、ラダープログラム７８が継続され、Ｓ８に進む。
【００５１】
Ｓ４でＣＰＵ１０（ユニット間同期部７３、プログラム実行部７１）は、基本ユニットタイマ８８のタイマ値に基づき定周期で発生する同期リフレッシュのための割り込みによってラダープログラムを中断する。たとえば、ユニット間同期部７３は基本ユニットタイマ８８のタイマ値に基づきプログラム実行部７１にラダープログラムを中断するよう指示する。これによりプログラム実行部７１はラダープログラムを中断する。なお、割り込み自体が中断の指示として認識されてもよい。
【００５２】
Ｓ５でＣＰＵ１０（第２更新部７６）は同期リフレッシュを実行する。第２更新部７６は複数あるデバイスのうち設定データ７９によって同期リフレッシュの対象として選択されているデバイスについて一括リフレッシュを実行する。
【００５３】
Ｓ６でＣＰＵ１０（ユニット間同期部７３）はユニット間同期プログラムを実行する。基本ユニット３のユニット間同期部７３と拡張ユニット４のユニット間同期部１１４は拡張バスを通じて通信し、相互にタイマ値を一致させることで双方の制御周期を同期させる。
【００５４】
Ｓ７でＣＰＵ１０（ユニット間同期部７３、プログラム実行部７１）はラダープログラム７８を再開する。たとえば、ユニット間同期部７３はプログラム実行部７１にラダープログラムを再開するよう指示する。これによりプログラム実行部７１はラダープログラムを再開する。
【００５５】
Ｓ８でＣＰＵ１０（基本ユニット制御部７０）はラダープログラム７８が終了したかどうかを判定する。ラダープログラム７８が終了していなければ、Ｓ３に戻る。ラダープログラム７８が終了したのであれば、Ｓ９に進む。
【００５６】
Ｓ９でＣＰＵ１０（基本ユニット制御部７０）は上述したＥＮＤ処理を実行する。これにより１つのキャンタイムが終了する。その後、次のスキャンを開始するために、Ｓ１に戻る。以降、ランモードからメンテナンスモードに切り替わるまで、図５に示したように、スキャンＴにしたがって本フローチャートに係る処理が繰り返し実行される。
【００５７】
ここではラダープログラム７８の実行中にユニット間同期が実行されるものとして説明したが、一括リフレッシュ（Ｓ１）中やＥＮＤ処理（Ｓ９）中のいずれにおいてもユニット間同期は実行される。つまり、Ｓ１およびＳ９にはＳ３ないしＳ７に相当するステップが含まれている。ここで、Ｓ４、Ｓ７に記載のラダープログラムは一括リフレッシュとＥＮＤ処理に読み替えられるものとする。
【００５８】
図１１は拡張ユニット４が実行する処理を示すフローチャートである。ここでは一括リフレッシュについては省略している。なお、ＣＰＵ１１０はシステムプログラム１１７にしたがって以下の処理を実行する。
【００５９】
Ｓ１１でＣＰＵ１１０（ユニット間同期部１１４）はユニット間同期の通知が発生するのを待つ。拡張バスを通じてユニット間同期の通知を受信すると、Ｓ１２に進む。
【００６０】
Ｓ１２でＣＰＵ１１０（ユニット間同期部１１４、バッファ更新部１１６）は同期リフレッシュを実行する。バッファ更新部１１６は、第２デバイス１２０のうち入力デバイスに格納されているデバイス値を基本ユニット３に転送し、基本ユニット３から受信したデバイス値を出力デバイスに格納する。なお、ダブルバッファ構成が採用される場合、バッファ更新部１１６は、第１バッファ１２１と第２バッファ間でデバイス値の更新を行う。出力デバイスに関しては、基本ユニット３から受信したデバイス値が第１バッファ１２１に格納され、その後、第１バッファ１２１から第２バッファ１２２にコピーされる。拡張ユニット制御部１１３によって実行される内部処理は第２バッファ１２２に格納されているデバイス値を参照する。入力デバイスに関しては、拡張ユニット制御部１１３が実行する内部処理によって第２バッファ１２２に格納されたデバイス値が第１バッファ１２１にコピーされ、その後、第１バッファ１２１から基本ユニット３に転送される。
【００６１】
Ｓ１３でＣＰＵ１１０（拡張ユニット制御部１１３）は第１デバイス１１８や第２デバイス１２０のうち入力デバイスからデバイス値を読み出し、デバイス値にしたがって内部処理を実行する。拡張ユニット制御部１１３は内部処理の実行結果を第１デバイス１１８や第２デバイス１２０のうち出力デバイス（とりわけ、出力デバイスの第２バッファ１２２）に格納する。
【００６２】
このようにユニット間同期のタイミングで同期リフレッシュを実行することで、一括リフレッシュを前提とした通信用プログラム（基本ユニットが拡張ユニットと通信するためのプログラム）を同期リフレッシュの対象となったデバイスについても適用できるようになる。従来技術では、一括リフレッシュの対象となっていなかったデバイスなどについて任意のタイミングで最新のデバイス値が必要になるときは、平場のラダープログラム（メインのラダープログラム）内でダイレクト通信によってデバイス値を更新する必要があった。しかし、これはユーザにとって面倒なプログラミング作業であった。一方で、本実施例によれば、一括リフレッシュの対象となっていなかったデバイスについても同期リフレッシュによって更新されるため、ダイレクト通信のためのコードが不要となり、一括リフレッシュを前提とした通信用プログラムを同期リフレッシュに関しても流用できるようになる。
【００６３】
＜バッファメモリへの同期リフレッシュの適用＞
なお、ＰＬＣ２ではデバイスとは別にバッファメモリＵＧと呼ばれる記憶領域が存在する。デバイスはリフレッシュの対象となる記憶領域であり、バッファメモリＵＧ（単にバッファと呼ばれることもある）はリフレッシュの対象とならず、ダイレクト通信によりアクセスされていた。このようなバッファメモリＵＧについても同期リフレッシュの対象として選択されてもよい。これにより、デバイスと比較してより複雑なコードが必要となっていたバッファメモリＵＧについても、同期リフレッシュにより、デバイスと同様なコードにより扱うことが可能となる。とりわけ、複数のバッファメモリＵＧに格納される値（バッファ値と呼ぶことにする）には、一緒のタイミングで更新される必要がある複数のバッファ値の集合や（同時性）、更新の順序が決まっている複数のバッファ値の集合が存在する（順序性）。たとえば、１つ目のバッファメモリには分母が格納され、２つ目のデバイスには分子が格納されており、この分母と分子とによって制御値が決定されることがある。このような制御値において、拡張ユニット制御部１１３が分母を取得した後で、分子が同期リフレッシュによって書き換えられてしまうと、分母と分子のペアが破たんし（泣き別れ）、制御値が異常となる。よって、分母と分子のペアのように同時性を要求されるバッファ値に関しては同期リフレッシュにおいて同時性や順序性を維持しつつ、更新される。また、伝達遅延時間の一定性が要求されるバッファメモリＵＧについても、第３デバイス８３を割り付けて同期リフレッシュが適用されてもよい。これにより伝達遅延時間の一定性が確保されよう。なお、バッファメモリＵＧについてもダブルバッファ構成が採用されてもよい。なお、同期リフレッシュの対象となるバッファメモリＵＧおよび第３デバイス８３については明細書の全体において第２デバイスと同様に扱われるものとする。つまり、第２デバイスに関する説明はそのままバッファメモリＵＧと第３デバイス８３に適用される。また、バッファメモリＵＧおよび第３デバイス８３が一括リフレッシュの対象として選択された場合、第１デバイスに関する説明はそのままバッファメモリＵＧと第３デバイス８３に適用される。
【００６４】
＜同期リフレッシュの対象となるデバイスの選択＞
上述したようにユニット間同期はリフレッシュタイミングよりも短い周期（例：５０ｕｓ〜５ｍｓ）で実行されることがある。これは、基本ユニット３と拡張ユニット４との応答性（別の言い方をすれば、外部入力機器に対する基本ユニットの応答性、又は、基本ユニットに対する外部出力機器の応答性）のバラツキを小さくするためである。ユニット間同期を実行するタイミングで同期リフレッシュを実行するには、ユニット間同期の同期周期内で同期リフレッシュを完了しなければならない。よって、同期リフレッシュの対象となるデバイスの数はある程度制限される必要があるだろう。たとえば、一括リフレッシュの対象となっていたすべてのデバイスを同期リフレッシュの対象として選択してしまうと、ユニット間同期の周期を短くできなくなり、基本ユニット３と拡張ユニット４との応答性のバラツキを小さくすることが困難となろう。そこで、ユニット間同期の同期周期の長さを考慮して同期リフレッシュの対象が予め選択される。この選択は、プログラム作成支援装置１で実行されたり、または、基本ユニット３の操作部６を通じて実行されたりする。また、同期リフレッシュを割り込みプログラムにより実現し、選択されたデバイスについて同期リフレッシュが実行される。これは、スキャンタイムが長くなったりするなど、変動したりしても、安定的にユニット間同期と同期リフレッシュとを実現する。この場合、ユニット間同期は、スキャンタイム内のいずれの場所でも実行されうる。たとえば、ユニット間同期部７３および第２更新部７６は、ラダープログラムの実行期間だけでなく、一括リフレッシュの期間でもユニット間同期と同期リフレッシュを実行してもよい。定周期でユニット間同期と同期リフレッシュが実行されるようになり、基本ユニット３と拡張ユニット４との応答性のバラツキが小さくなろう。
【００６５】
なお、プログラム作成支援装置１の設定データ作成部８４は、同期リフレッシュの対象となるデバイスやバッファメモリＵＧを選択するが、そもそもユニット間同期の対象となる拡張ユニット４を選択してもよい。これにより、ユニット間同期の対象となる拡張ユニット４の数が多く、ユニット間同期リフレッシュの対象になるデータの量が多い場合であっても、ユニット同期を実現しつつ、ユニット間同期の同期周期（例えば２００μｓ）を短くすることができる。図１６に例示するように、設定データ作成部８４は、基本ユニット３に対して接続される複数の拡張ユニット４を列挙したリスト９０などを表示し、操作部８から入力された指示に応じて、複数の拡張ユニット４のそれぞれについてユニット間同期の対象とするか否かを選択してもよい。たとえば、基本ユニット３と拡張ユニット４との応答性のバラツキを小さくする必要がある位置決めユニット（モーションユニット）についてはユニット間同期の対象として選択されてもよい。ＬＡＮ通信ユニットなどはそれほどリアルタイム性を要求されないため、ユニット間同期の対象として選択されなくてもよい。なお、設定データ作成部８４は、ユニット間同期に対応していない拡張ユニット４については強制的にユニット間同期の対象外を選択し、ユーザに対して選択の余地を与えなくてもよい。たとえば、設定データ作成部８４はそのような拡張ユニットについてはグレーアウト表示し、操作部８による選択を不能にしてもよい。
【００６６】
設定データ作成部８４は、ユニット間同期の対象として選択された拡張ユニットについては、さらに、占有デバイスなどの特定のデバイスのリフレッシュを一括リフレッシュの対象とするか、それとも同期リフレッシュの対象とするかを選択するためのＧＵＩを表示部７に表示してもよい。占有デバイスとは、拡張ユニットごとに予め割り付けられたデバイスのことである。たとえば、基本ユニット３との間での通信量が多い拡張ユニット４についてはその占有デバイスを同期リフレッシュの対象とすることで、一括リフレッシュ用のプログラムコードを同期リフレッシュ用に流用することが容易になる。なお、設定データ作成部８４は、ユニット間同期の周期を短くすることが必要な拡張ユニット４の占有デバイスについてはあえて同期リフレッシュの対象外として選択してもよい。このようなデバイスについてはユニット間同期のタイミングで同期リフレッシュを行わないため、同期周期を短くすることが可能となる。
【００６７】
＜複数のデバイス値の泣き別れの抑制＞
上述したように分子と分母とにより定まる比率などを正しく伝達するには、分子と分母とが同時性の要件を満たしてユニット間でリフレッシュされる必要がある。これを実現する手法としてすでにダブルバッファ構成について説明したが、他の排他調停方法が使用されてもよい。
【００６８】
上述したように、拡張ユニット４の内部処理は複数の出力デバイスの値を参照する。また、拡張ユニット４の内部処理は複数の処理結果を入力デバイス値に格納する。複数の出力デバイスの値には同時性を要求されるものがある。同様に、複数の入力デバイス値にも同時性を要求されるものがある。
【００６９】
そこで、図１２が示すように、基本ユニット３の第２更新部７６がこれのデバイスについて同期リフレッシュを完了するまで待ってから、拡張ユニット４は内部処理を開始する。つまり、図１２に示すように、第１拡張ユニットおよび第２拡張ユニットのユニット間同期部１１４は、ユニット間同期によって同期リフレッシュのための割り込みが発生すると所定の待ち時間（リフレッシュ待ち時間と呼ばれてもよい）が経過するのを待ってから、拡張ユニット制御部１１３に内部処理を開始させる。なお、この待ち時間の間に、基本ユニット３の第２更新部７６がデバイスやバッファメモリＵＧの同期リフレッシュを実行する。これにより、デバイス値が同期リフレッシュされている期間においては、拡張ユニット制御部１１３の内部処理がデバイス値を読み込んだり、書き込んだりしないようになり、泣き別れが発生しないようになる。このように拡張ユニット４のユニット間同期部１１４が同期リフレッシュと内部処理とを同期させることで、同期リフレッシュによるデバイスへのアクセスと、内部処理によるそのデバイスへのアクセスとが同時には発生しないようになる。つまり、拡張ユニット制御部１１３は待ち時間中のデバイスへのアクセスが排他または調停される。この排他・調停機能は、ユニット間同期部１１４に内蔵されてもよいが、拡張ユニット制御部１１３に内蔵されてもよい。排他・調停機能（禁止機能）は、同期周期の開始タイミングから所定の待ち時間を計時するタイマやカウンタを備えていてもよい。
【００７０】
なお、所定の待ち時間内に同期リフレッシュが完了しない場合や、そもそも所定の待ち時間を設けない場合などでは、同期リフレッシュが完了する前に内部処理が開始されてしまうことがあろう。この場合は、上述したダブルバッファ構成が有効である。つまり、同期リフレッシュは第１バッファ１２１に対して実行され、拡張ユニット４の内部処理による第１バッファ１２１へのアクセスは排他または調停される。つまり、同期リフレッシュによるアクセスよりも後に発生したアクセスは同期リフレッシュによるアクセスが完了するまで待たされることになる。同様に、拡張ユニット４の内部処理は第２バッファ１２２にアクセスし、同期リフレッシュによる第２バッファ１２２へのアクセスは排他または調停される。つまり、内部処理によるアクセスよりも後に発生した同期リフレッシュによるアクセスは内部処理によるアクセスが完了するまで待たされることになる。第１バッファ１２１と第２バッファ１２２のデバイス値の更新はバッファ更新部１１６によってユニット間同期タイミング（同期周期の開始タイミング）で実行される。これによって、複数のデバイス値の泣き別れが抑制される。上述したように、バッファメモリＵＧについてもダブルバッファ構成が採用されてもよい。
【００７１】
＜デバイス値の伝達遅延時間＞
デバイス値の伝達遅延時間については一定時間に制御されることが望ましいことがある。上述したようにユニット間同期は、基本ユニット３と拡張ユニット４との間における応答性のバラツキを小さくするために実行される。しかし、基本ユニット３の制御周期と拡張ユニット４の制御周期とを同期させるだけでは不十分なことがある。つまり、基本ユニット３と拡張ユニット４との間におけるデバイス値の伝達遅延時間が一定になれば、さらに応答性のバラツキが小さくなる。上述したように複数のデバイス値の泣き別れは、これらのデバイス値それぞれの伝達遅延時間が一致しないために発生することが多い。特に、これらのデバイス値に対する内部処理によるアクセスが非同期で発生することが原因となりやすい。
【００７２】
そこで、上述したように同期リフレッシュの実行タイミングと内部処理の実行タイミングとを同期させることで、デバイスに対する非同期アクセスが抑制され、伝達遅延時間のバラツキが小さくなる。なお、伝達遅延時間のバラツキを小さくするためには、上述したダブルバッファ構成も有効である。あるデバイスに対する同期リフレッシュによるアクセスと、拡張ユニット４の内部処理によるアクセスとが競合しなくなるため、基本ユニット３と内部処理による非同期アクセスが生じないようになる。よって、伝達遅延時間のバラツキが小さくなる。
【００７３】
図１３はダブルバッファの動作を説明する図である。ここでは基本ユニット３に対して入力ユニットである第１拡張ユニットと出力ユニットである第２拡張ユニットが接続されているものとする。同期周期の開始時点では、第１拡張ユニットの第１バッファ１２１にはデバイス値としてＸ０が格納されており、第２バッファ１２２にはＸ１が格納されている。同様に、第２拡張ユニットの第１バッファ１２１にはデバイス値としてＹ０が格納されており、第２バッファ１２２にもＹ０が格納されている。
【００７４】
ユニット間同期のための割り込みが発生すると、第１拡張ユニットのバッファ更新部１１６は第２バッファ１２２のデバイス値を第１バッファ１２１にコピーする。なお、出力ユニットである第２拡張ユニットはこの時点でバッファ間のコピーを実行しなくてもよい。基本ユニット３の第２更新部７６はまず、同期リフレッシュのうち入力リフレッシュを実行する。つまり、第２更新部７６は第１拡張ユニットの第１バッファ１２１からデバイス値を読み出し、第１拡張ユニットに割り付けられた第２デバイスに８２コピーする。
【００７５】
次に、第２更新部７６は、同期リフレッシュのうち出力リフレッシュを実行する。つまり、第２更新部７６は第２拡張ユニットの第１バッファ１２１からデバイス値を読み出し、第２拡張ユニットに割り付けられた第２デバイス８２にコピーする。
【００７６】
割り込みが発生したタイミングから所定時間が経過すると、基本ユニット３のユニット間同期部７３と第１拡張ユニットおよび第２拡張ユニットのユニット間同期部１１４がお互いの制御周期を位相レベルで一致させる。この同期処理が完了した時点、またはこの同期処理の開始時点に、第１拡張ユニットおよび第２拡張ユニットの拡張ユニット制御部１１３は、内部処理を開始する。図１３では、同期処理の開始時点で内部処理が開始されるように制御されている。なお、第２拡張ユニットのバッファ更新部１１６は、内部処理の開始タイミングで第１バッファ１２１のデバイス値を第２バッファ１２２にコピーする。
【００７７】
その後、第１拡張ユニットの拡張ユニット制御部１１３は内部処理の結果に応じて第２バッファ１２２のデバイス値を更新する。第２拡張ユニットの拡張ユニット制御部１１３は第２バッファ１２２のデバイス値を参照し、デバイス値に応じて内部処理を実行する。
【００７８】
なお、入力リフレッシュを実行し、次に、ユニット間同期（ユニット間同期プログラム）や内部処理を実行し、最後に出力リフレッシュを実行することも考えられる。この場合、第１拡張ユニットと第２拡張ユニットとの間でデバイス値を伝達すると、２つの同期周期が必要になる。つまり、１つ目の同期周期において第１拡張ユニットから基本ユニット３にデバイス値を伝達し、その後、内部処理が実行されて、基本ユニット３からデバイス値が第２拡張ユニットに伝達される。第２拡張ユニットは次の同期周期においてデバイス値を参照し、内部処理を実行する。よって、２つの同期周期が必要になる。一方で、図１３に示すように、入力リフレッシュを実行し、次に出力リフレッシュを実行し、最後にユニット間同期や内部処理を実行すると、１つの同期周期の遅延で済むといった利点がある。つまり、１つ目の同期周期において第１拡張ユニットから基本ユニット３にデバイス値が伝達され、その後、基本ユニット３からデバイス値が第２拡張ユニットに伝達され、そのデバイス値が内部処理よって参照可能となる。よって、１つの同期周期内で、第１拡張ユニットと第２拡張ユニットとがデバイス値を送受信できるようになる。ただし、内部処理は割り込みが発生したタイミングから所定の待ち時間が経過するまで待ってから実行される必要がある。
【００７９】
第１拡張ニットと第２拡張ユニットとが通信する必要がある事例としては位置決めユニットと、位置決めユニットにトリガーを与える入力ユニットとを含むＰＬＣ２が考えられる。より具体的には、入力ユニットのセンサでワーク（検査対象物）を検知すると、検知したことを示すデバイス値が基本ユニット３に伝達され、さらに位置決めユニットに伝達される。位置決めユニットはこのデバイス値に基づいてモータなどを起動し、位置決めを実行する。
【００８０】
このような複数の拡張ユニット間でのデバイス値の通信における遅延を短くするには、入力リフレッシュと出力リフレッシュを実行してからユニット間同期を実行する方が有利であろう。とりわけ、位置決めユニットのように高速動作が要求されるユニットが関与する、拡張ユニット間でのデバイス値の通信では、このような処理の順番が向いている。
【００８１】
＜ビットデバイスとワードデバイスのリフレッシュ＞
デバイスやバッファメモリには１ビットのデバイス値を記憶するものと、１ワードのデバイス値を記憶するものとがある。つまり、リフレッシュの対象となるものにはビット型のものやワード型のものが混在している。このような場合にも上述した順序性が必要となることがある。順序性の要件を満たす方法としては、デバイス値の送信側が送信すべきデバイス値をデバイスに格納すると、フラグをセットする。伝送路においては、デバイス値が先に伝送され、その後でフラグが伝送される。受信側は、フラグがセットされたことを認識すると、デバイスからデバイス値を読み出す。これにより、受信側はデバイス値を少ない遅延時間でもって読み出せるようになる。なお、フラグはビット型のデバイスで実現されうる。つまり、ワードデバイスに格納された伝送すべきワードデータ（ワードデバイス値）を先に転送し、フラグを格納したビットデバイスのデバイス値を後から転送することが要求されることがある。もし、フラグを先に転送してしまうと、古いワードデバイス値が読み出されてしまうことがあるからである。
【００８２】
ユニット間同期よりも高い優先度の割り込みが同期リフレッシュの実行中に発生することがある。この場合、入力デバイスに関してはワードデバイスが先に更新され、その後でビットデバイスが更新される。出力デバイスに関しても同様に順序性が要求される。この場合は、ビットデバイスが先に転送され、ワードデバイスが後に転送される。なお、基本ユニット３の基本ユニット制御部７０や拡張ユニット４の拡張ユニット制御部１１３は、同期リフレッシュが実行されている期間での他の手段による割り込みを禁止してもよい。
【００８３】
なお、フラグとなるデバイスにダブルバッファ構成を適用してもよい。この場合、上述したビットデバイスとワードデバイスの更新順序が逆になる。ここでは、ビットデバイスとワードデバイスについて説明したが、ワードデバイスをビットデバイスとして使用するケースでも本実施例は適用可能である。つまり、本実施例は、ワードデバイスしか存在しないケースでもワードデバイス間の更新順序を維持するためにも使用可能である。
【００８４】
＜内部処理の延期＞
拡張ユニット４のユニット間同期部１１４は延期部１１５を備えていてもよい。同期リフレッシュが完了していないにもかかわらず、内部処理が開始されてしまうと、上述した泣き別れ問題が発生しうる。そこで、ユニット間同期部１１４は同期リフレッシュが所定の待ち時間で完了しなかったことを検知すると、内部処理の発生タイミングを延期させてもよい。なお、延期時間は動的に決定されてもよいし、静的に決定されていてもよい。前者では、ユニット間同期部１１４が同期リフレッシュの完了を検知すると、内部処理を開始させる。後者では、ユニット間同期部１１４が所定の延期時間の経過を待って、内部処理を開始させる。
【００８５】
同期リフレッシュの遅延は、フロー制御に伴うリトライなどが原因で発生することがある。このような場合に延期部１１５は有用であるが、代わりに上述したダブルバッファ構成が採用されてもよい。ダブルバッファ構成を採用することで、同時性の問題や順序性の問題、さらには伝達遅延時間のバラツキ問題も緩和される。
【００８６】
＜一括リフレッシュやスキャンタイムを拡張ユニットの制御周期に同期させること＞
上述した実施例はユニット間同期により基本ユニット３の制御周期と拡張ユニット４の制御周期とが整合されるが、一括リフレッシュやスキャンタイムはこれらとは非同期で実施されてもよい。しかし、ユニット間同期を実行するためには割り込みが必要となる。もし、拡張ユニット４の制御周期に対して、一括リフレッシュやスキャンタイムも同期させることができれば、割り込みが不要となろう。
【００８７】
図１４は一括リフレッシュやスキャンタイムを拡張ユニットの制御周期に同期させる処理を示すフローチャートである。この処理は基本ユニット３のＣＰＵ１０で実行される。
【００８８】
Ｓ１５でＣＰＵ１０（第１更新部７５）は一括入力リフレッシュを実行する。一括入力リフレッシュとは、入力デバイスについての上述した一括リフレッシュである。Ｓ１６でＣＰＵ１０（プログラム実行部７１）はラダープログラム７８を実行する。Ｓ１７でＣＰＵ１０（第１更新部７５）は一括出力リフレッシュを実行する。一括出力リフレッシュとは、出力デバイスについての上述した一括リフレッシュである。Ｓ１８でＣＰＵ１０（基本ユニット制御部７０）はＥＮＤ処理を実行する。ＥＮＤ処理は周辺処理とも呼ばれ、外部インターフェースからのデータの取得やロギング処理によるデータの収集などである。ＥＮＤ処理も同期周期に連動して実行されるようになる。Ｓ１９でＣＰＵ１０（ユニット間同期部７３）はユニット間同期を実行するタイミングになったかどうかを判定する。ユニット間同期タイミングが到来すると、ユニット間同期部７３は、ユニット間同期の対象として指定されている拡張ユニット４のユニット間同期部１１４と同期処理を実行し、お互いの制御周期を一致させる。その後、Ｓ１５に戻る。つまり、ユニット間同期によって、基本ユニット３と拡張ユニット４の制御周期が一致するともに、拡張ユニット４の制御周期とスキャンタイミングも同期することになる。
【００８９】
このようにユニット間同期をトリガーとしてラダープログラム７８のスキャンが実行されるため、スキャンタイムは拡張ユニット４の制御周期に対して同期することになる。なお、図１４に示してフローチャートからわかるように、同期周期とスキャンタイムはほぼ同じ長さとなる。
【００９０】
図１５は一括リフレッシュやスキャンタイムを拡張ユニットの制御周期に同期させる他の処理を示すフローチャートである。この処理は基本ユニット３のＣＰＵ１０で実行される。図１４と比較すると、同期リフレッシュも実行される点が特に異なっている。
【００９１】
Ｓ２０でＣＰＵ１０（第２更新部７６）は同期リフレッシュを実行する。Ｓ２１でＣＰＵ１０（第１更新部７５）は一括リフレッシュを実行する。一括リフレッシュには一括入力リフレッシュと一括出力リフレッシュとが含まれている。Ｓ２２でＣＰＵ１０（プログラム実行部７１）はラダープログラム７８を実行する。Ｓ２３でＣＰＵ１０（基本ユニット制御部７０）はＥＮＤ処理を実行する。Ｓ２４でＣＰＵ１０（ユニット間同期部７３）は基本ユニットタイマ８８のタイマ値に基づき、ユニット間同期を実行するタイミングになったかどうかを判定する。ユニット間同期タイミングが到来すると、ユニット間同期部７３は、ユニット間同期の対象として指定されている拡張ユニット４のユニット間同期部１１４と同期処理を実行し、お互いの制御周期を一致させる。その後、Ｓ２０に戻る。このようにユニット間同期に連動して同期リフレッシュと一括リフレッシュとが実行されてもよい。これにより割り込みプログラムを使用することなく、一括リフレッシュやスキャンタイムを拡張ユニットの制御周期に同期させることが可能となる。
【００９２】
なお、スキャンタイムは固定長のものと可変長のものとがある。プログラム作成支援装置１の設定データ作成部８４は、固定長のスキャンタイムにしたがってラダープログラム７８を実行することをユーザによって指示されたときは、さらに、スキャンタイムをユニット間同期によって同期させるか、同期させないかをユーザの指示にしたがって選択してもよい。どちらが選択されたかは設定データ７９に格納される。基本ユニット３のＣＰＵ１０は設定データ７９を参照することで、どちらが選択されたかを認識に、選択された動作モードにしたがってスキャンを実行する。なお、スキャンタイムをユニット間同期によって同期させることが選択された場合、設定データ作成部８４は、ユーザ指示にしたがって同期周期を設定してもよい。スキャンタイムをユニット間同期によって同期させることが選択されていない場合、設定データ作成部８４は、ユーザ指示にしたがってスキャンタイムを設定してもよい。
【００９３】
＜バッファメモリの同期リフレッシュ＞
すでに所々で触れたように、デバイスだけでなく、バッファメモリＵＧについても同期リフレッシュが適用されてもよい。一般にデバイスはリフレッシュにより更新されるが、バッファメモリＵＧは更新されない。そのため、従来は、バッファメモリＵＧに関しては、必要に応じてラダープログラム７８内でダイレクト通信を実行するための命令が記述される必要があった。なお、基本ユニット３は複数の占有デバイスを有しており、そのうちの幾つかが拡張ユニット４に対して割り付けられる。よって、拡張ユニット４のデバイスに対して割り付けられていない基本ユニット３のデバイス（第３デバイス８３）については、バッファメモリＵＧを割り付けることでバッファメモリＵＧもリフレッシュすることが可能となる。これにより、バッファメモリＵＧについても同期リフレッシュの対象となる。
【００９４】
プログラム作成支援装置１の設定データ作成部８４はユーザ指示に応じてバッファメモリＵＧに対応する第３デバイス８３を選択する。たとえば、設定データ作成部８４は、拡張ユニットごとの設定データを作成するために、デバイスのリストを表示部７に表示する。このリストには、各デバイスの識別情報、たとえば、デバイス番号（例：ＤＭ３１０００など）が列挙される。また、各デバイスの隣の欄には、対応するバッファメモリＵＧを指定するための欄が設けられてもよい。この欄には、バッファメモリＵＧの識別情報（例：ＵＧ２１５８など）が操作部８から入力される。なお、設定データ作成部８４はバッファメモリＵＧに対応する第３デバイス８３を一括リフレッシュの対象とするか、同期リフレッシュの対象とするかを、ユーザ指示に応じて選択する。設定データ作成部８４はユーザによって選択されたリフレッシュの方式についても設定データ７９に書き込む。
【００９５】
このように、バッファメモリＵＧが第３デバイス８３に関連付けられるため、第２更新部７６は設定データ７９にしたがって、バッファメモリＵＧも第２デバイスとして同期リフレッシュを実行する。また、一括リフレッシュの対象として選択されたバッファメモリＵＧについては第１デバイスとして第１更新部７５が一括リフレッシュを実行する。
【００９６】
バッファメモリＵＧに関しても上述した同期リフレッシュを実行することで同時性や順序性、伝達遅延時間の一定性などの問題が解決ないしは緩和される。
【００９７】
占有デバイスの同期リフレッシュとバッファメモリＵＧの同期リフレッシュが同期周期内のどのタイミングで実行されるかについて説明する。たとえば、第２更新部７６は、入力デバイスについて同期リフレッシュを実行し、次に、入力バッファメモリについて同期リフレッシュを実行する。第２更新部７６は、出力バッファメモリについて同期リフレッシュを実行し、次に、出力デバイスについて同期リフレッシュを実行する。このように入力系が先にリフレッシュされ、その後に、出力系がリフレッシュされてもよい。占有デバイスが先にリフレッシュされ、その後にバッファメモリがリフレッシュされてもよい。第２更新部７６は、入力デバイスについて同期リフレッシュを実行し、次に、出力デバイスについて同期リフレッシュを実行する。さらに、第２更新部７６は、出力バッファメモリについて同期リフレッシュを実行し、次に入力バッファメモリについて同期リフレッシュを実行する。最後に、ユニット間同期部７３がユニット間同期を実行する。なお、上述したように拡張ユニット間での通信に関しては後者の事例の方が有利であろう。
【００９８】
ところでバッファメモリＵＧについてダイレクト通信で更新しようとすると、泣き別れ問題が発生することがあった。これはバッファメモリＵＧのサイズが３２ビットなどに制限されているときに発生しうる。そこで、上述したダブルバッファ構成などの泣き別れ対策をバッファメモリＵＧにも適用することで、泣き別れ問題が緩和される。
【００９９】
＜まとめ＞
図１などを用いて説明したように、ＰＬＣ２は、ユーザプログラムをスキャン毎に繰り返し実行する基本ユニット３と、基本ユニット３に接続される拡張ユニット４とを有する。図８などを用いて説明したように、拡張ユニット４は、
外部機器が接続されるインターフェース１２３と、インターフェース１２３を介した外部機器からの入力値またはインターフェース１２３を介した外部機器への出力値に関するデバイス値が格納され、基本ユニット３とデータ共有するためのデバイスが割り付けられた記憶部である記憶装置１１１と、クロックを計数して時間を計測する拡張ユニットタイマ１１９を有している。図７などを用いて説明したように、基本ユニット３は基本ユニットタイマ８８、ユニット間同期部７３、第１更新部７５および第２更新部７６を有している。ユニット間同期部７３は拡張ユニットタイマ１１９のタイマ値と基本ユニットタイマ８８のタイマ値を同期させる。第１更新部７５はスキャン毎のリフレッシュの期間内で拡張ユニット４が保持しているデータと基本ユニット３が保持しているデータとを一致させる。第２更新部７６はユニット間同期部７３により拡張ユニットタイマ１１９のタイマ値と同期した基本ユニットタイマ８８のタイマ値に基づいてスキャン中に定周期で実行される処理の期間内で拡張ユニット４が保持しているデータと基本ユニット３が保持しているデータとを一致させる。なお、ユーザプログラムであるラダープログラム７８に記述される拡張ユニット４に割り付けられたデバイスは、第１更新部７５による更新の対象および／または第２更新部７６による更新の対象として設定可能に構成される。これによりユーザのプログラミングの負担が軽減され、ユーザビリティが向上する。
【０１００】
見方を変えれば、本実施例では、一括リフレッシュの対象に設定可能なデバイスや同期リフレッシュの対象に設定可能なデバイス、あるいは、一括リフレッシュの対象にも同期リフレッシュの対象にも設定可能なデバイスが用意されたことになる。その結果、平場のラダープログラム７８の記述をユニット間同期プログラムにコピーした場合であっても、平場のラダープログラム７８に記述されたデバイスを、ユニット間同期リフレッシュの対象に設定変更するだけで、リフレッシュが実行される。よって、プログラムの変更作業が軽減される。また、ユニット間同期リフレッシュの対象に含めるかどうかはユーザが自由に設定可能であるため、一部のデバイスをユニット間同期リフレッシュの対象から外すことで（図１６には拡張ユニットに割り付けられた複数のデバイスを一括して対象に設定したり、対象外に設定したりする例が示されている。）、ユニット間同期リフレッシュ期間の増大を抑制することができる。
【０１０１】
このように、デバイスは、第１更新部７５による更新の対象として設定されてもよいし、第２更新部７６による更新の対象として設定されてもよい。基本ユニット制御部７０や設定データ作成部８４は、デバイスを更新する手段として第１更新部７５と第２更新部７６とのうち少なくとも一方を選択する選択手段として機能してもよい。この更新部の選択は一括リフレッシュの対象とするか、それとも同期リフレッシュの対象とするかの選択に相当し、更新タイミングの選択にも相当しよう。このように基本ユニット３と拡張ユニット４との間で共有すべきデータの更新タイミングを選択可能とすることで、ユーザビリティを向上させることが可能となる。つまり、一括リフレッシュ期間だけでなく、ユーザプログラムが実行されている期間などの他の期間において同期リフレッシュが実行されるようになる。その結果、一括リフレッシュ期間が長くなりすぎるといったことは起きにくくなる。なお、いくつかのデバイスについては同期リフレッシュと一括リフレッシュの双方が適用されてもよい。
【０１０２】
基本ユニット３は、基本ユニット３が有する内部機能の制御タイミングと拡張ユニット４の制御タイミングとを同期させる同期処理を実行するユニット間同期部７３をさらに有している。ユニット間同期部７３は、例えばタイマ等によって実現される。第２更新部７６は、ユーザプログラムが実行されている期間内でユニット間同期部７３が同期処理を実行するタイミングになると、拡張ユニット４が保持しているデータと基本ユニット３が保持しているデータとを一致させるよう同期リフレッシュを実行する。このようにユニット間同期のタイミングで同期リフレッシュが実行されるようになる。ユーザプログラム内でデバイスやバッファメモリのダイレクト通信を行うことも可能であるが、これはプログラムコード（ラダー図）の流用性が乏しく、また複雑なプログラミングが必要になる。一方で、ユニット間同期のタイミングで同期リフレッシュを実行すれば、一括リフレッシュ用のプログラムコードと同様の簡易なコードによってデバイスやバッファメモリの同期リフレッシュが可能となる。よって、ユーザのプログラミングに関する負担が軽減されよう。
【０１０３】
図６や図１０などを用いて説明したように、ユニット間同期部７３は、ユニット間同期のタイミングが到来するとユニット間同期を実行する。これによりユーザプログラムの実行期間中であってもユニット間同期が実行されるため、基本ユニット３の制御タイミングと拡張ユニット４の制御タイミングとのずれを小さくすることが可能となる。また、ユーザプログラムの実行期間中においてユニット間同期に付随して同期リフレッシュが実行されるようになり、一括リフレッシュの期間を待つことなく、デバイスやバッファメモリを更新できるようになる。
【０１０４】
図１４や図１５を用いて説明したように、基本ユニット３は、ユニット間同期をトリガー（トリガ）としてスキャンを実行してもよい。つまり、基本ユニット３は、拡張ユニット４に適用されている制御周期に対して第１更新部７５が更新を実行するタイミングを同期させるユニット間同期部７３をさらに有していてもよい。ユニット間同期部７３は基本ユニット３の制御周期に対して拡張ユニット４に適用されている制御周期を同期させるものである。しかし、ユニット間同期部７３は拡張ユニット４に適用されている制御周期に対して第１更新部７５が更新を実行するタイミングを同期させるように動作してもよい。拡張ユニット４の内部処理は拡張ユニット４の制御周期に同期して実行される。また、デバイスやバッファメモリに格納されるデータは内部処理の動作に必要なものであったり、内部処理の結果であったりする。拡張ユニット４の制御周期にしたがってデータをリフレッシュすれば、データの伝達遅延時間が削減されよう。
【０１０５】
基本ユニット３および拡張ユニット４はそれぞれデータを保持するメモリであるデバイスメモリを有し、デバイスメモリは、拡張ユニット４のデータを基本ユニット３へ伝達するための入力デバイスメモリと、基本ユニット３のデータを拡張ユニット４に伝達するための出力デバイスメモリとを含む。第１更新部７５および第２更新部７６は、拡張ユニット４のデバイスメモリに記憶されているデータを基本ユニット３のデバイスメモリへコピーすることで入力デバイスメモリのデータを更新するとともに、基本ユニット３のデバイスメモリに記憶されているデータを拡張ユニット４のデバイスメモリへコピーすることで出力デバイスメモリのデータを更新する。これにより入力デバイスや出力デバイスについて一括リフレッシュと同期リフレッシュとが実行されるようになる。このように第１更新部７５および第２更新部７６のリフレッシュ動作はよく似ているため、一括リフレッシュ用のコードを同期用のリフレッシュ用のコードとして流用しやすくなる。
【０１０６】
入力デバイスメモリは拡張ユニット４が有する機能の状態を表すデータを記憶するものである。たとえば、拡張ユニット４の被制御装置１６がセンサなどであれば、センサの検知結果（検知状態）を示すデバイス値が入力デバイスメモリに格納されることになる。出力デバイスメモリは拡張ユニット４が有する機能の制御するデータを記憶するものである。たとえば、拡張ユニット４の被制御装置１６がモータなどであれば、そのモータの回転数などを示すデバイス値が出力デバイスメモリに格納されるようになる。
【０１０７】
図６などを用いて説明したように、一括リフレッシュの期間において第１更新部７５が出力デバイスメモリに保持されているデータを更新する。次に、第１更新部７５が入力デバイスメモリに保持されているデータを更新する。その次にユーザプログラムが実行されている期間内において第２更新部７６がデータを更新してもよい。出力デバイスメモリには内部処理によって参照されるデータや命令が格納されているため、一括リフレッシュの期間においては出力デバイスメモリが先にリフレッシュされてもよい。もちろん、入力デバイスメモリが先にリフレッシュされてもよい。
【０１０８】
第２更新部７６は、基本ユニット３に設けられ、データを保持するメモリであるデバイスメモリと、拡張ユニット４に設けられ、一括リフレッシュの対象とならないデータを保持するバッファメモリとの間でデータを一致させてもよい。このようにデバイスとバッファメモリとを対応付けることで、バッファメモリについてもあたかもデバイスであるかのようにリフレッシュ可能となる。
【０１０９】
基本ユニット制御部７０は、第２更新部７６による更新の対象となるデータを指定する更新対象指定情報（設定データ７９）を記憶する記憶装置１２を有していてもよい。第２更新部７６は、設定データ７９によって指定されたデータをユーザプログラムが実行されている期間内で同期リフレッシュする。第１更新部７５は、設定データ７９によって指定されていないデータを一括リフレッシュの期間で一括リフレッシュする。このようにデバイスやバッファメモリについて適用されるリフレッシュのタイミングは設定データ７９によって保持されてもよい。
【０１１０】
設定データ作成部８４に関して説明したように、設定データ７９は、基本ユニット３に接続され、ユーザプログラムを作成して当該基本ユニット３に転送するプログラム作成支援装置上で作成された情報であってもよい。プログラム作成支援装置１の操作部８は基本ユニット３の操作部６よりも操作がしやすい。また、プログラム作成支援装置１の表示部７は基本ユニット３の表示部５よりも表示可能な情報量が多い。よって、デバイスやバッファメモリについて適用されるリフレッシュのタイミングを選択しやすくなるであろう。
【０１１１】
第２更新部７６がデータを更新している間は第２更新部７６以外の他の手段による当該データの読み書きを排他または調停する排他・調停手段として基本ユニット制御部７０やデバイス制御部７２が機能してもよい。上述したように同期リフレッシュの実行中にデータが変更されてしまうと、同時性の問題が発生しうる。よって、他の手段によるデータの読み書きを排他または調停することで、同時性の問題を解決できるようになろう。
【０１１２】
デバイス制御部７２は、相互に更新の連動性を要求される複数のデータが第２更新部７６によって更新されている期間においては第２更新部７６以外の他の手段による当該複数のデータの読み書きを排他または調停してもよい。これにより同時性の問題が解決しよう。
【０１１３】
デバイス制御部７２は、それぞれ基本ユニット３と拡張ユニット４との間におけるデータの伝達時間（伝達遅延時間）をほぼ一定にすることが要求される複数のデータが第２更新部７６によって更新されている期間においては第２更新部７６以外の他の手段による当該複数のデータの読み書きを排他または調停してもよい。これにより複数のデバイス値についての伝達遅延時間のバラツキが小さくなろう。
【０１１４】
デバイス制御部７２は、それぞれ更新順序が定められている複数のデータが第２更新部７６によって更新されている期間においては第２更新部７６以外の他の手段による当該複数のデータの読み書きを排他または調停してもよい。たとえば、複数のデータは、ビット型のデータとワード型のデータであってもよい。第２更新部７６は、基本ユニット３のビット型のデータとワード型のデータを拡張ユニット４へコピーするときはビット型のデータをコピーしてからワード型のデータをコピーしてもよい。また、第２更新部７６は、拡張ユニット４のビット型のデータとワード型のデータを基本ユニット３へコピーするときはワード型のデータをコピーしてからビット型のデータをコピーしてもよい。これにより上述した順序性の問題が解決するであろう。なお、ワード型のデータの一部がビット型のデータとして使用されるケースにも本実施例は適用可能である。
【０１１５】
拡張ユニット４は、第２更新部７６における更新処理の遅延時間に応じて当該拡張ユニット４で実行される内部処理の開始を遅延させてもよい。同期リフレッシュの対象となるデバイスやバッファメモリの数が多くなったり、フロー制御によるデータの再送が多く発生したりすると、同期リフレッシュの時間が長くなる。その結果、所定の待ち時間を過ぎても同期リフレッシュが完了しなくなってしまう。同期リフレッシュが完了していないにもかかわらず、内部処理を開始してしまえば、上述した同時性の問題が発生しうる。よって、このよう場合は内部処理を遅延させて、同時性等の問題を解決してもよい。
【０１１６】
デバイス制御部７２は、第２更新部７６がデータを更新している間は割り込み処理を禁止してもよい。同期リフレッシュの最中に割り込みが入ってしまうと、同時性の問題や伝達遅延時間のバラツキの問題などが発生しやすくなる。同期リフレッシュの最中は割り込みを禁止することで、同時性の問題や伝達遅延時間のバラツキの問題などが緩和されよう。
【０１１７】
拡張ユニット４は、基本ユニット３に設けられている記憶装置１２にデータを保持していてもよい。一般にデバイスやバッファメモリは基本ユニット３と拡張ユニット４との双方に設けられるために、リフレッシュが必要となる。しかし、拡張ユニット４の第１デバイス１１８や第２デバイス１２０が基本ユニット３の記憶装置１２に設けられ、記憶装置１２内でリフレッシュが実行されてもよい。これは、拡張ユニット４のデバイスメモリやバッファメモリがどこにあるかは問題とならないことを意味する。このように、基本ユニット３のデバイスメモリやバッファメモリと拡張ユニット４のデバイスメモリやバッファメモリとが同一の記憶装置内に配置されていたとしても、上述した実施例は適用可能である。
【０１１８】
ところで、基本ユニット３の記憶装置１２は、ユーザプログラム（ラダープログラム７８）と、拡張ユニット４の内部処理の実行タイミングと同期して実行される同期プログラム（制御プログラム７７の一部）とを記憶するプログラム記憶手段として機能してもよい。これらはプログラム実行手段であるＣＰＵ１０によって実行される。とりわけ、ラダープログラム７８についてプログラム実行部７１で実行される。第１デバイス８１や第２デバイス８２はユーザプログラムにおいて拡張ユニット４の内部処理に割り付けられている第１デバイスメモリの一例である。
【０１１９】
ＰＬＣ２の基本ユニット３または拡張ユニット４は、第１デバイスメモリに記憶されているデータと同一のデータを記憶するように制御される第２デバイスメモリを有している。第２デバイスメモリは、たとえば、記憶装置１２に確保され、拡張ユニット４によってアクセスされる。または、第２デバイスメモリは、拡張ユニット４の記憶装置１１１に確保された第１デバイス１１８や第２デバイス１２０であってもよい。第１更新部７５や第２更新部７６は第１デバイスメモリに記憶されているデータと第２デバイスメモリに記憶されているデータとが一致するように更新処理を実行する更新手段として機能する。ただし、第１更新部７５や第２更新部７６は拡張ユニット４のＣＰＵ１１０によって実現されていてもよい。拡張ユニット４のユニット間同期部１１４は自己または拡張ユニット制御部１１３が管理する同期周期にしたがって基本ユニット３に割り込みを実行し、同期リフレッシュとユニット間同期を実行してもよい。なお、プログラム作成支援装置１の設定データ作成部８４や基本ユニット３の操作部６などは、一括リフレッシュの期間と同期リフレッシュの期間とのうちのいずれの期間で更新処理を実行するかを設定する設定手段として機能する。設定データ７９は、拡張ユニット４からアクセス可能な記憶装置１２、記憶装置１１１に格納され、拡張ユニット制御部１１３やユニット間同期部１１４により読み出されてもよい。
【０１２０】
基本ユニット３は、基本ユニット３の制御周期と拡張ユニット４の制御周期とを同期させるユニット間同期部７３と、ユニット間同期部７３が同期処理を実行する同期周期における所定期間において、拡張ユニット４が保持しているデータと基本ユニット３が保持しているデータとが一致するように更新する第２更新部７５とを有する。第２更新部７５は、相互に更新の連動性を要求される複数のデータまたは予め定められた更新順序にしたがって更新されることを要求される複数のデータを更新してもよい。これにより同時性の問題や順序性の問題などが緩和されよう。
【０１２１】
なお、リアルタイム性が要求されないようなデータを扱う拡張ユニットについては、従来通り、一括リフレッシュされればよい。一方で、モーションユニット（位置決めユニット）などリアルタイム性や高速動作が要求される拡張ユニットについては、同期リフレッシュの対象とされてもよい。とりわけ、同期周期が短くなると、１つのスキャンタイムにおいて多数の回数にわたって同期リフレッシュが実行されることになる。よって、同期リフレッシュの対象となる拡張ユニットやそのデバイスが増えれば増えるほど、スキャンタイムが延びてしまったり、内部処理の開始が遅れてしまったりする。よって、同期周期がスキャンタイムより短い場合は、同期リフレッシュの対象を絞ることが望ましいだろう。これは、第２拡張ユニット４のデータのうち第２更新部７６によって更新されるデータと第１更新部７５によって更新されるデータとを選択する選択手段を設けることで、ユーザが同期リフレッシュの対象を絞ってもよい。
【０１２２】
拡張ユニット４は、第２更新部７６がデータの更新処理を完了した後で当該データを参照して内部処理を実行してもよい。これは、データの更新処理が完了する前にそのデータを内部処理が使用してしまうと同時性の問題などが発生するからである。なお、第２更新部７６は、拡張ユニット４が内部処理を実行していない期間にデータの更新処理を実行してもよい。これにより同時性の問題が緩和されよう。
【０１２３】
拡張ユニット４は、第２更新部７６によって更新されるデータを記憶する第１バッファ１２１と、当該拡張ユニット４の内部処理によって参照されるデータを記憶する第２バッファ１２２とを備えていてもよい。この場合、バッファ更新部１１６は、ユニット間同期処理が実行されるときに第１バッファ１２１に記憶されているデータと第２バッファ１２２に記憶されているデータとが一致するように更新する第３更新手段として機能する。第２更新部７６は、バッファ更新部１１６が更新処理を完了した後で、更新処理を実行する。たとえば、第２更新部７６は、同期周期の開始タイミングから所定期間が経過してから同期リフレッシュを実行する。所定期間は、バッファ更新部１１６が更新処理を完了するのに十分な期間であり、予め設定される。
【０１２４】
拡張ユニット４は、ユニット間同期部１１４による同期処理が遅延すると、内部処理の開始タイミングを延期する延期部１１５をさらに有していてもよい。同期処理の遅延は、伝送路でのエラー等、突発的な事象が原因となることが多い。そのため、常に一定期間を待たせるよりも、遅延時間に応じて内部処理を遅らせた方が有利であろう。
【０１２５】
図１４や図１５を用いて説明したように、基本ユニット３は、ユニット間同期部７３が同期処理を実行するタイミングになると、一括リフレッシュの期間に遷移してもよい。これにより、ユニット間同期により獲得された同期周期に対してスキャンの開始タイミングを整合させることが可能となる。
【０１２６】
上述したように、基本ユニット３はユーザプログラムにおいて拡張ユニット４の内部処理に割り付けられているデバイスメモリを有している。また、基本ユニット３または拡張ユニット４は、デバイスメモリに記憶されているデータと同一のデータを記憶するように制御されるバッファメモリＵＧを有していてもよい。なお、基本ユニット３にバッファメモリＵＧが配置される場合、拡張ユニット４からこのバッファメモリＵＧはアクセスされ、データを読み書きされることになろう。第１更新部７５や第２更新部７６は、拡張ユニット４の制御周期に同期して、デバイスメモリに記憶されているデータとバッファメモリＵＧに記憶されているデータとが一致するように更新処理を実行してもよい。このようにバッファメモリＵＧをデバイスに割り付けることで、バッファメモリＵＧについてもあたかもデバイスのように一括リフレッシュや同期リフレッシュが適用可能となる。
【０１２７】
上述したように複数の拡張ユニット４が基本ユニット３を介してデバイス値を送受信するときにも本発明は有利であろう。この場合、基本ユニット３は、少なくとも、基本ユニット３の制御周期と複数の拡張ユニット４の制御周期とを同期させるユニット間同期部７３と、ユーザプログラムにおいて第１拡張ユニット４の内部処理に割り付けられており、当該第１拡張ユニット４から基本ユニット３に転送すべきデータを記憶する第１デバイスメモリと、ユーザプログラムにおいて第２拡張ユニット４の内部処理に割り付けられており、基本ユニット３から当該第２拡張ユニット４へ転送すべきデータを記憶する第２デバイスメモリとを有している。なお、図７では第１デバイス８１や第２デバイス８２はそれぞれ１つずつしか記載されていないが、これらは複数個あってもよい。よって、第１デバイスメモリや第２デバイスメモリとは、複数の第１デバイス８１や複数の第２デバイス８２に相当する。
【０１２８】
第１拡張ユニット４は、第１デバイスメモリに記憶されているデータと同一のデータを記憶するように制御される第１バッファメモリを有していてもよい。第２拡張ユニット４は、第２デバイスメモリに記憶されているデータと同一のデータを記憶するように制御される第２バッファメモリを有していてもよい。図８には、第１デバイス１１８と第２デバイス１２０が例示されているが、これとは別にバッファメモリＵＧが記憶装置１１１に設けられている。図１３が示すように、第１拡張ユニット４から入力されたデバイス値が基本ユニット３を介して第２拡張ユニット４に転送されてもよい。これを実現するために、第１更新部７５または第２更新部７６は、拡張ユニット４の制御周期に同期して、第１デバイスメモリに記憶されているデータと第１バッファメモリに記憶されているデータとが一致するように更新処理を実行し、次に、第２デバイスメモリに記憶されているデータと第２バッファメモリに記憶されているデータとが一致するように更新処理を実行する。なお、第１更新部７５または第２更新部７６は拡張ユニット４側に設けられていてもよい。第１拡張ユニット４は、第２更新部７６が同期リフレッシュを完了した後で内部処理を開始する。同様に、第２拡張ユニット４は、第２更新部７６が同期リフレッシュを完了した後で内部処理を開始する。これにより一つの同期周期の伝達遅延時間だけで複数の拡張ユニット間でのデバイス値の送受信が実現可能となる。
【図１】
0006535459.tif 000002
【図２】
0006535459.tif 000003
【図３】
0006535459.tif 000004
【図４】
0006535459.tif 000005
【図５】
0006535459.tif 000006
【図６】
0006535459.tif 000007
【図７】
0006535459.tif 000008
【図８】
0006535459.tif 000009
【図９】
0006535459.tif 000010
【図１０】
0006535459.tif 000011
【図１１】
0006535459.tif 000012
【図１２】
0006535459.tif 000013
【図１３】
0006535459.tif 000014
【図１４】
0006535459.tif 000015
【図１５】
0006535459.tif 000016
【図１６】
0006535459.tif 000017