Exemplo n.º 1
0
def search_magnet() -> None:
    global CONNECT_MAGNET
    while True:
        power.set_iset(Current(400, "mA"))
        time.sleep(0.3)
        resistance: float = power.vout_fetch() / power.iout_fetch().A()
        if resistance > 4:
            now = "ELMG"
        else:
            now = "HELM"
        power.allow_output(False)
        print("接続先を入力してください。"
              "電磁石=>\"ELMG\"\tヘルムホルツ=>\"HELM\"")
        answer = input(">>>")
        if now in answer:
            break
        elif answer == "Force":
            print("強制接続先を入力してください。"
                  "電磁石=>\"ELMG\"\tヘルムホルツ=>\"HELM\"")
            force = input("###")
            if force == "ELMG":
                now = "ELMG"
                break
            elif force == "HELM":
                now = "HELM"
                break
            else:
                continue
        elif answer == "":
            continue
        else:
            logger.error("接続先が不一致か入力内容が不正")
            print("接続先を強制するには\"Force\"と入力してください")
    power.allow_output(True)
    if now == "ELMG":
        print("Support Magnet Field is +-4kOe")
        power.CURRENT_CHANGE_LIMIT = Current(200, "mA")
        CONNECT_MAGNET = "ELMG"
        power.set_iset(Current(500, "mA"))
        time.sleep(0.5)
        resistance = power.vout_fetch() / power.iout_fetch().A()
        power.MAGNET_RESISTANCE = resistance
        return
    else:
        print("Support Magnet Field is +-100Oe")
        power.CURRENT_CHANGE_DELAY = 0.3
        CONNECT_MAGNET = "HELM"
        power.set_iset(Current(400, "mA"))
        time.sleep(0.2)
        resistance = power.vout_fetch() / power.iout_fetch().A()
        power.MAGNET_RESISTANCE = resistance
        gauss.range_set(2)
        return
Exemplo n.º 2
0
def magnet_field_ctl_helmholtz(target: int) -> Current:
    if CONNECT_MAGNET == "HELM":  # ヘルムホルツコイル制御部
        if target > HELM_MAGNET_FIELD_LIMIT:
            logger.error("磁界制御入力値過大")
            print("最大磁界200Oe")
            raise ValueError
        target_current = Current(int(target / HELM_Oe2CURRENT_CONST), "mA")
        power.set_iset(target_current)
        return target_current
    else:
        raise ValueError
Exemplo n.º 3
0
    def measure_test(self) -> None:
        """
        測定設定ファイルを検証する
        """
        if self.have_error:
            logger.error("設定ファイルに致命的な問題あり")
            self.verified = False
            return
        if self.force_demag:
            oe_mode = True
            if self.control_mode == "current":
                oe_mode = False
            print("消磁中")
            demag(self.demag_step, oe_mode)
            print("消磁完了")
        sequence: List[List[Union[int, float, Current]]]
        cache_lr: List[List[int]] = []
        cache_lc: List[List[int]] = []
        if self.is_cached and self.use_cache:
            print("cached")
            sequence = self.cached_sequence
        else:
            sequence = self.measure_sequence
        i = 0
        for seq in sequence:
            start_time = datetime.datetime.now()
            print("測定開始:", start_time.strftime('%Y-%m-%d %H:%M:%S'))
            try:
                if self.use_cache and self.is_cached and self.autorange:
                    cache_c, cache_r = self.measure_process(seq, start_time, cached_range=self.cached_range[i])
                else:
                    cache_c, cache_r = self.measure_process(seq, start_time)
            except ValueError:
                logger.error("測定値指定が不正です")
                self.verified = False
                return
            i += 1
            if self.use_cache and (not self.is_cached):
                cache_lc.append(cache_c)
                cache_lr.append(cache_r)

        self.verified = True
        if self.use_cache and (not self.is_cached):
            self.is_cached = True
            self.cached_sequence = cache_lc
            self.cached_range = cache_lr

        print("測定設定は検証されました。")
        gauss.range_set(0)
        power.set_iset(Current(0, "mA"))
        return
Exemplo n.º 4
0
def demag(step: int = 15, field_mode: bool = True):
    if CONNECT_MAGNET == "ELMG" and field_mode:
        max_current = magnet_field_ctl(4000, True).mA()
    elif CONNECT_MAGNET == "ELMG" and (not field_mode):
        max_current = 4300
        power.set_iset(Current(max_current, "mA"))
    elif CONNECT_MAGNET == "HELM":
        max_current = magnet_field_ctl(100, True).mA()
    else:
        raise ValueError
    time.sleep(1.0)
    flag = 1
    max_current = float(max_current)
    for i in range(0, step):
        print("Step: " + str(i + 1) + "/" + str(step) + "...", end="", flush=True)
        flag = flag * -1
        x = 1 - (float(i) / float(step))
        nc = flag * max_current * (x ** 2)
        power.set_iset(Current(nc, "mA"))
        time.sleep(1.0)
        print("!")

    power.set_iset(Current(0, "mA"))
    return
Exemplo n.º 5
0
def power_ctl(cmd: List[str]) -> None:
    """
    電源関連のコマンド

    :param cmd:入力コマンド文字列

    """
    if len(cmd) == 0:
        return
    req = cmd[0]
    if req == "status":
        print("ISET=" + str(power.iset_fetch()) + "\tIOUT=" + str(power.iout_fetch()) + "\tVOUT=" + str(
            power.vout_fetch()) + "V")
        return
    elif req == "iout":
        print("IOUT=" + str(power.iout_fetch()))
        return

    elif req == "iout":
        print("IOUT=" + str(power.vout_fetch()) + "V")
        return
    elif req == "iset":
        print("ISET=" + str(power.iset_fetch()))
        if len(cmd) == 1:
            return
        if len(cmd) >= 4:
            unit = cmd[3]
        else:
            unit = "mA"
        try:
            current = (Current(float(cmd[1]), unit=unit))
        except ValueError:
            print("Command Value is Missing."
                  "ex) 400 mA or 4.2 A")
            return
        power.set_iset(current)
        return

    else:
        print("""
        status\t電源状態表示
        iset\t電流値設定[mA]表示
        iset set x mA 電流出力設定(強制 安全装置なし)
        
        """)
        return
Exemplo n.º 6
0
    def measure(self) -> None:
        """
        測定プログラム
        """
        if not self.verified:
            print("設定ファイルの検証を行ってください。")
            return
        if self.force_demag:
            oe_mode = True
            if self.control_mode == "current":
                oe_mode = False
            print("消磁中")
            demag(self.demag_step, oe_mode)
            print("消磁完了")
            winsound.Beep(BEEP_HZ, BEEP_DOT)
            time.sleep(BEEP_DOT / 1000)
            winsound.Beep(BEEP_HZ, BEEP_DOT)

        if self.use_cache and self.is_cached:
            sequence = self.cached_sequence
        else:
            sequence = self.measure_sequence
        i = 0
        for seq in sequence:
            print("測定シーケンスに入ります Y/n s(kip)")
            r = input(">>>>>").lower()
            if r == "n":
                break
            if r == "s":
                continue
            file = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + ".log"
            file, start_time = gen_csv_header(file)
            if self.use_cache and self.is_cached and self.autorange:
                self.measure_process(seq, start_time, save_file=file, cached_range=self.cached_range[i])

            else:
                self.measure_process(seq, start_time, save_file=file)
            print("測定完了")
            winsound.Beep(BEEP_HZ, BEEP_DOT)
            time.sleep(BEEP_DOT / 1000)
            winsound.Beep(BEEP_HZ, BEEP_DOT)

        gauss.range_set(0)
        power.set_iset(Current(0, "mA"))
        return
Exemplo n.º 7
0
    def measure_lock_record(self, target: Union[float, int], pre_lock_time: float, post_lock_time: float,
                            start_time: datetime.datetime, save_file: str = None, mes_range: int = None) -> Current:
        current = None
        change_range = False
        if not (mes_range is None):
            change_range = True
            now_range = gauss.range_fetch()
            if mes_range < now_range:
                gauss.range_set(mes_range)
                change_range = False
        if self.control_mode == "current" or (self.is_cached and self.use_cache):
            current = Current(target, "mA")
            power.set_iset(current)
        elif self.control_mode == "oectl":
            current = magnet_field_ctl(target, self.autorange)

        if change_range:
            gauss.range_set(mes_range)

        time.sleep(pre_lock_time)
        status = load_status()
        status.set_origin_time(start_time)
        status.target = target
        print(status)
        if save_file:
            save_status(save_file, status)

        if post_lock_time == 0:
            return current
        time.sleep(post_lock_time)

        status = load_status()
        status.set_origin_time(start_time)
        status.target = target
        print(status)
        if save_file:
            save_status(save_file, status)
        return current
Exemplo n.º 8
0
def magnet_field_ctl(target: int, auto_range: bool = False) -> Current:
    """
    磁界制御を行う
    電磁石の場合は1 Oe -> 1 mA換算で電流を変化させる
    ヘルムホルツコイルの場合は磁界-電流変換式を用いる

    目標磁界に対応した電流値を最後に返す

    :param target: ターゲット磁界(Oe)
    :param auto_range: オートレンジを使用するか(電磁石のみ有効)
    :return: 最終電流

    :raise ValueError: 目標磁界が出力制限を超過する場合は命令を発行せずに例外を投げる
    """
    if CONNECT_MAGNET == "ELMG":  # 電磁石制御部
        if target > ELMG_MAGNET_FIELD_LIMIT:
            logger.error("磁界制御入力値過大")
            print("最大磁界4.1kOe")
            raise ValueError
        now_range = gauss.range_fetch()
        next_range = 0

        if auto_range:
            next_range = get_suitable_range(target)

            if now_range == next_range:  # レンジを変えないとき
                auto_range = False
                pass
            elif now_range < next_range:  # レンジを下げる方向
                pass
            else:  # レンジを上げる
                gauss.range_set(next_range)
                now_range = next_range
                auto_range = False
                time.sleep(0.1)
        now_field = gauss.magnetic_field_fetch()

        field_up: int
        if target - now_field > 0:
            field_up = 1
        else:
            field_up = -1

        loop_limit = OECTL_LOOP_LIMIT
        while True:
            while True:  # 磁界の一致を待つ
                palfield = gauss.magnetic_field_fetch()
                if palfield == now_field:
                    break
                now_field = palfield
                time.sleep(0.2)

            if auto_range:  # レンジを下げる処理
                r = get_suitable_range(now_field)

                if next_range == 0:
                    auto_range = False

                if r == now_range:
                    pass
                if r > now_range:
                    if r == next_range:
                        gauss.range_set(next_range)
                        now_range = r
                        auto_range = False
                    elif r < next_range:
                        gauss.range_set(r)
                        now_range = r
                    else:
                        pass
                else:
                    pass

            while True:  # 磁界の一致を待つ
                palfield = gauss.magnetic_field_fetch()
                if palfield == now_field:
                    break
                now_field = palfield
                time.sleep(0.2)

            if loop_limit == 0:
                break
            loop_limit -= 1

            diff_field = target - now_field

            if field_up == 1 and diff_field <= 1:
                break
            if field_up == -1 and diff_field >= -1:
                break

            elmg_const = OECTL_BASE_COEFFICIENT - OECTL_RANGE_COEFFICIENT * now_range

            # 次の設定値を算出
            now_current = power.iset_fetch()
            diff_current = Current(diff_field * elmg_const, "mA")
            if abs(diff_current) < Current(2, "mA"):
                if diff_current > 0:
                    diff_current = Current(2, "mA")
                else:
                    diff_current = Current(-2, "mA")

            next_current = now_current + diff_current
            power.set_iset(next_current)

            continue

        # 初期差分算出
        last_current = power.iset_fetch()
        now_field = gauss.magnetic_field_fetch()
        diff_field = target - now_field
        if abs(diff_field) >= 1:
            last_current = last_current + Current(diff_field * 0.9, "mA")
        last_current = last_current + Current(-(4 - now_range) * field_up, "mA")
        return last_current

    elif CONNECT_MAGNET == "HELM":  # ヘルムホルツコイル制御部
        return magnet_field_ctl_helmholtz(target)
    else:
        raise ValueError
Exemplo n.º 9
0
def init() -> None:
    gauss.range_set(0)
    power.set_iset(Current(0, "mA"))