using HslCommunication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mesnac.PlcUtils
{
    /// <summary>
    /// PLC 工具类接口
    /// </summary>
    public interface IPlc
    {
        bool IsConnected { get; set; }

        /// <summary>
        /// 建立连接
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        bool Connect(string IP, int port);

        /// <summary>
        /// 断开连接
        /// </summary>
        /// <returns></returns>
        bool DisConnect();

        /// <summary>
        /// 通过地址和长度读取PLC数据
        /// </summary>
        /// <param name="len"></param>
        /// <param name="address"></param>
        /// <returns></returns>
        byte[] readValueByAddress(int len, string address);

        /// <summary>
        /// 通过PLC地址写入int类型数据
        /// </summary>
        /// <param name="value"></param>
        /// <param name="address"></param>
        /// <returns></returns>
        bool writeValueByAddress(int value, string address);

        /// <summary>
        /// 通过PLC地址清零数据
        /// </summary>
        /// <param name="address"></param>
        /// <param name="len"></param>
        /// <returns></returns>
        bool resetByAddress(string address, int len);

        /// <summary>
        /// 通过PLC地址读取EA值
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        string readEaByAddress(string address);

        /// <summary>
        /// 通过PLC地址读取交互信号
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        int readInteractiveSignal(string address);

        /// <summary>
        /// 通过PLC地址读取int32类型数据
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        int readInt32ByAddress(string address);

        /// <summary>
        /// 通过PLC地址写入int32类型数据
        /// </summary>
        /// <param name="address"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        bool writeInt32ByAddress(string address, int value);

        /// <summary>
        /// 通过PLC地址读取string类型数据
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        string readStringByAddress(string address, ushort length);

        /// <summary>
        /// 通过PLC地址写入String类型数据
        /// </summary>
        /// <param name="address"></param>
        /// <param name="SFC"></param>
        /// <returns></returns>
        bool writeStringByAddress(string address, string value);

        /// <summary>
        /// 通过PLC地址读取Bool类型数据
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        OperateResult<bool> readBoolByAddress(string address);

        /// <summary>
        /// 通过PLC地址写入Bool类型数据
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        bool writeBoolByAddress(string address, bool value);

        /// <summary>
        /// 通过PLC地址写入Double类型数据
        /// </summary>
        /// <param name="address"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        bool writeDoubleByAddress(string address, int value);
    }
}